单元测试接口存储库的目的是什么

ahs*_*ele 6 c# tdd unit-testing rhino-mocks

我是一个单元测试ICustomerRepository用于检索类型对象的接口Customer.

  • 作为一个单元测试我通过ICustomerRepository这种方式测试获得了什么价值?
  • 在什么条件下,下面的测试会失败?
  • 对于这种性质的测试,建议进行我知道应该失败的测试吗?即4当我知道我只放在5存储库中时查找id

我可能遗漏了一些明显的东西,但似乎实现的类的集成测试ICustomerRepository将更有价值.

[TestClass]
public class CustomerTests : TestClassBase
{
    private Customer SetUpCustomerForRepository()
    {
        return new Customer()
        {
            CustId = 5,
            DifId = "55",
            CustLookupName = "The Dude",
            LoginList = new[]
            {
                new Login { LoginCustId = 5, LoginName = "tdude" },
                new Login { LoginCustId = 5, LoginName = "tdude2" }
            }
        };
    }

    [TestMethod]
    public void CanGetCustomerById()
    {
        // arrange
        var customer = SetUpCustomerForRepository();
        var repository = Stub<ICustomerRepository>();

        // act
        repository.Stub(rep => rep.GetById(5)).Return(customer);

        // assert
        Assert.AreEqual(customer, repository.GetById(5));
    }
}
Run Code Online (Sandbox Code Playgroud)

测试基类

public class TestClassBase
{
    protected T Stub<T>() where T : class
    {
        return MockRepository.GenerateStub<T>();
    }
}
Run Code Online (Sandbox Code Playgroud)

ICustomerRepository和IRepository

public interface ICustomerRepository : IRepository<Customer>
{
    IList<Customer> FindCustomers(string q);
    Customer GetCustomerByDifID(string difId);
    Customer GetCustomerByLogin(string loginName);
}

public interface IRepository<T>
{
    void Save(T entity);
    void Save(List<T> entity);
    bool Save(T entity, out string message);
    void Delete(T entity);
    T GetById(int id);
    ICollection<T> FindAll();
}
Run Code Online (Sandbox Code Playgroud)

fyj*_*ham 6

我可能会遗漏一些东西,但似乎你的测试的每一个方面都被嘲笑了?

一般来说,您只会模拟不是测试核心的对象.在这种情况下,您可以使用此存储库作为函数的源,您希望对存储库执行某些操作以检索客户#5并对其执行操作.

例如,您可以模拟客户存储库,以便您可以调用验证用户登录的方法.您将使用模拟存储库来防止您的单元测试依赖于真实的数据源,而不是测试您的模拟存储库.


Mar*_*son 5

规则#1的测试:

在编写之前了解测试的目的是什么以及它试图证明什么.如果你不知道它证明了什么,那就没用了:)

正如其他海报所说的那样,你正在对一个接口进行存根,然后调用存根 - 这并不能证明你的生产代码是否有效.

什么是存根?

存根用于提供固定值以驱动被测试类的某些方面.例如,假设您有一个CustomerService类型实例ICustomerRepository.如果你想看到CustomerService当存储库为空时可以优雅地处理错误情况,你将存根ICustomerRepositoryGetCustomerById方法返回任何/ null /抛出异常,然后确保CustomerService方法做了正确的事情(例如返回客户没找到结果).

即存根只是一个协作者,可以帮助您达到感兴趣的特定条件/行为.我们正在测试CustomerService,存根ICustomerRepository只是帮助我们实现目标.

你不是第一个问这个问题的人:).我通常建议开发人员先打开他们的测试双打.它有助于理解所有交互以及框架实际为您做的事情.