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)
我可能会遗漏一些东西,但似乎你的测试的每一个方面都被嘲笑了?
一般来说,您只会模拟不是测试核心的对象.在这种情况下,您可以使用此存储库作为函数的源,您希望对存储库执行某些操作以检索客户#5并对其执行操作.
例如,您可以模拟客户存储库,以便您可以调用验证用户登录的方法.您将使用模拟存储库来防止您的单元测试依赖于真实的数据源,而不是测试您的模拟存储库.
规则#1的测试:
在编写之前了解测试的目的是什么以及它试图证明什么.如果你不知道它证明了什么,那就没用了:)
正如其他海报所说的那样,你正在对一个接口进行存根,然后调用存根 - 这并不能证明你的生产代码是否有效.
什么是存根?
存根用于提供固定值以驱动被测试类的某些方面.例如,假设您有一个CustomerService类型实例ICustomerRepository.如果你想看到CustomerService当存储库为空时可以优雅地处理错误情况,你将存根ICustomerRepository的GetCustomerById方法返回任何/ null /抛出异常,然后确保CustomerService方法做了正确的事情(例如返回客户没找到结果).
即存根只是一个协作者,可以帮助您达到感兴趣的特定条件/行为.我们正在测试CustomerService,存根ICustomerRepository只是帮助我们实现目标.
你不是第一个问这个问题的人:).我通常建议开发人员先打开他们的测试双打.它有助于理解所有交互以及框架实际为您做的事情.
| 归档时间: |
|
| 查看次数: |
859 次 |
| 最近记录: |