Dan*_*sen 10 c# unit-testing mocking stub
我最近对测试非常感兴趣,我现在正努力学习以最佳方式进行单元测试.我和Ninoit一起使用Rhino Mocks.我在Stackoverflow上也经常阅读,但还没有找到我的问题的明确答案.
我想知道如果我有一个类似下面的方法,我应该模拟OfficeClass依赖项并测试GetAllOffices或仅使用存根来获取依赖关系并验证方法GetAllOffices已被调用,我确实得到了办公室,我从我的存根设置预期?
public Offices GetAllOffices()
{
try
{
var offices = officeClass.GetAllOffices();
return offices;
}
}
Run Code Online (Sandbox Code Playgroud)
如果OfficeClass只是另一个POCO,或者是否因为嘲弄和存根而被称为网络服务,它会有什么不同吗?
长问题简介:何时进行模拟以及何时进行单元测试中的Stub?
ner*_*rdo 11
模拟使用框架生成依赖项的"模拟".例如,如果officeClass是数据的存储库,那么您可以使用模拟框架(我使用MOQ)生成存储库的模拟.这就是为什么使用接口使其成为测试的理想选择,模拟框架可以轻松地模拟测试接口.
根据我的理解,使用存根,您可以手动删除依赖项并创建预设响应.例如,如果您有一个接口IOfficeClass并且您创建了一个继承自它的新类,则可以将该类注入您的服务以允许您使用它.
Web服务之类的东西应该包含在某个界面(如IRepository模式)中,这样您就可以轻松地测试逻辑而无需访问Web服务.与POCO课程相同.
例如,在您的情况下,您将拥有:
public interface IOfficeRepository
{
IQueryable<Office> GetAll();
}
Run Code Online (Sandbox Code Playgroud)
并为您服务
public class MyOfficeService
{
private readonly IOfficeRepository officeRepostiory;
public MyOfficeService(IOfficeRepository repository)
{
this.officeRepostiory = repository;
}
public Office GetOffice(int id)
{
return this.officeRepostiory.GetAll().SingleOrDefault(o => o.Id == id);
}
}
Run Code Online (Sandbox Code Playgroud)
这样,您还可以更改基础数据源,而无需修改主应用程序或业务逻辑代码.
你的单元测试使用moq看起来像这样:
[TestClass]
public class OfficeUnitTest
{
private MyOfficeService service;
[TestInitialize]
public void Setup()
{
var officeRepository = new Mock<IOfficeRepository>();
var office = new List<Office>();
office.Add(new Office{ Id = 1 });
officeRepository.Setup(m => m.GetAll()).Returns(office.AsQueryable());
this.service = new MyOfficeService(officeRepository.Object);
}
[TestMethod]
public void TestGetById()
{
Assert.IsNotNull(service.GetOffice(1));
// my mock will never return a value for 2
Assert.IsNull(service.GetOffice(2));
}
}
Run Code Online (Sandbox Code Playgroud)
您可以在下面阅读有关模拟和存根的更多信息:
http://martinfowler.com/articles/mocksArentStubs.html
http://msdn.microsoft.com/en-us/library/ff649690.aspx