我可以使用NUnit TestCase来测试模拟的存储库和真实的存储库

时间:2011-03-17 13:48:18

标签: nunit

我希望能够在我的假存储库(使用列表)上运行测试 和我的真实存储库(使用数据库)确保我的模拟版本都按预期工作,我的实际生产存储库按预期工作。我认为最简单的方法是使用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());
    }

但它要求持续表达。

2 个答案:

答案 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
}

底线是,测试用例属性必须采用常量表达式。但是,您可以通过将实例化代码推送到工厂来实现所需的结果。