我希望能够在我的假存储库(使用列表)上运行测试 和我的真实存储库(使用数据库)确保我的模拟版本都按预期工作,我的实际生产存储库按预期工作。我认为最简单的方法是使用TestCase
private readonly StandardKernel _kernel = new StandardKernel();
private readonly IPersonRepository fakePersonRepository;
private readonly IPersonRepository realPersonRepository;
[Inject]
public PersonRepositoryTests()
{
realPersonRepository = _kernel.Get<IPersonRepository>();
_kernel = new StandardKernel(new TestModule());
fakePersonRepository = _kernel.Get<IPersonRepository>();
}
[TestCase(fakePersonRepository)]
[TestCase(realPersonRepository)]
public void CheckRepositoryIsEmptyOnStart(IPersonRepository personRepository)
{
if (personRepository == null)
{
throw new NullReferenceException("Person Repostory never Injected : is Null");
}
var records = personRepository.GetAllPeople();
Assert.AreEqual(0, records.Count());
}
但它要求持续表达。
答案 0 :(得分:1)
您可能会查看TestCaseSource属性,但可能会因同一错误而失败。否则,你可能不得不接受两个单独的测试,它们都调用第三种方法来处理所有常见的测试逻辑。
答案 1 :(得分:1)
属性是属性的编译时修饰,因此放在TestCase属性中的任何内容都必须是编译器可以解析的常量。
您可以尝试这样的事情(未经测试):
[TestCase(typeof(FakePersonRespository))]
[TestCase(typeof(PersonRespository))]
public void CheckRepositoryIsEmptyOnStart(Type personRepoType)
{
// do some reflection based Activator.CreateInstance() stuff here
// to instantiate the incoming type
}
然而,这有点难看,因为我想你的两个不同的实现可能有不同的构造函数参数。另外,您真的不希望所有动态类型实例化代码都混乱测试。
可能的解决方案可能是这样的:
[TestCase("FakePersonRepository")]
[TestCase("TestPersonRepository")]
public void CheckRepositoryIsEmptyOnStart(string repoType)
{
// Write a helper class that accepts a string and returns a properly
// instantiated repo instance.
var repo = PersonRepoTestFactory.Create(repoType);
// your test here
}
底线是,测试用例属性必须采用常量表达式。但是,您可以通过将实例化代码推送到工厂来实现所需的结果。