重构目的
- 统一命名,改善命名混乱的局面
- 使用 场景 解决准备工作中存在大量重复代码的问题
目录结构
- 集成测试
- 作为管理员
- 我可以管理XXX
- 我可以管理YYY
- 已存在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);
......
};
}