框架重构:规范集成测试的结构和命名规则

重构目的

  • 统一命名,改善命名混乱的局面
  • 使用 场景 解决准备工作中存在大量重复代码的问题

目录结构

  • 集成测试
    • 作为管理员
      • 我可以管理XXX
        • 测试一.cs
        • 测试二.cs
      • 我可以管理YYY
        • 测试一.cs
        • 测试二.cs
      • 已存在XXX场景.cs
      • 已存在YYY场景.cs
    • 作为普通用户
      • ......
    • SetUp.cs
    • EstablishHelper.cs

继承结构

代码说明

SetUp.cs

  • 主要负责service对象的实例化,部分对象可能需要mock对象
public class SetUp : BaseActionSpec
{
    protected static IAdminService AdminService;
    protected static ISecurityService SecurityService;
    protected static IAuthenticationService AuthenticationService;

    protected Establish WorkstageManageContext = () =>
    {
        AdminService = A<IAdminService>();
        SecurityService = A<ISecurityService>();

        AuthenticationService = MockRepository.GenerateMock<IAuthenticationService>();
        IoC.Current.RegisterInstance(typeof(IAuthenticationService), AuthenticationService);
            
        AuthenticationService = MockRepository.GenerateMock<IAuthenticationService>();
        IoC.Current.RegisterInstance(typeof(IAuthenticationService), AuthenticationService);

        IoC.Current.RegisterInstance(typeof(IFileHelper), new FileHelperForTest());
    };
}

EstablishHelper.cs

  • 通过封装,为测试提供更加简便的 创建对象返回Identifier 操作
public class EstablishHelper : SetUp
{
    public static SaftLawIdentifier CreateSafeLaw(string name)
    {
        return AdminService.CreateSaftLaw()
            .Name(name)
            .Entity.Id;
    }
}

已存在XXX场景.cs

  • 创建后续用于测试的实体对象以及其他通用的准备工作
  • 场景可以从其他场景继承,共享相同的准备工作
  • 将用于添加测试和编辑测试需要的字段定义放在场景,避免重复的代码
public class 已存在法律法规场景 : EstablishHelper
{
    Establish context = () => Id = CreateSafeLaw("安全法");
    
    protected static SaftLawIdentifier Id;
    protected static string Name = "Name";
    ......
}
public class 已存在XXX场景 : EstablishHelper {}
public class 已存在YYY场景 : 已存在XXX场景 {}

当浏览XXX列表页面时.cs

  • 如果使用了通用的准备工作,从某个场景继承
  • 如果不需要通用的准备工作,则从EstablishHelper继承
  • 对于Action的测试,学习使用Machine.Specifications.Mvc的语法
[Subject(typeof(SaftLawController), "Index")]
public class 当浏览法律法规列表页面时 : 已存在法律法规场景
{
    Establish context = () => subject = Action<SaftLawController>(x => x.Index());

    Because of = () => result = subject.Invoke();

    It 应该正确的浏览到所有的法律法规信息 = () => result.ShouldBeAView()
        .And().ShouldHaveModelOfType<IEnumerable<SaftLaw>>()
        .And().Select(x => x.Id).ShouldContainOnly(Id);
}

当提交XXX添加页面时.cs

[Subject(typeof(SaftLawController), "Create")]
public class 当提交安全法律法规添加页面时 : 已存在法律法规场景
{
    Establish context = () =>
    {
        var form = new FormCollection();
        form.Add(Keys.Name, Name);
        ......
        subject = Action<SaftLawController>(x => x.Create(form));
    };

    Because of = () => subject.Invoke();

    It 应该成功添加法律法规 = () =>
    {
        var saftlaw = repository.FindOne(new SaftLaw.ByName(Name));
        saftlaw.Name.ShouldEqual(Name);
        ......
    };
}
posted @ 2017-04-21 16:15  屠一刀  阅读(473)  评论(0编辑  收藏  举报