【发布时间】:2012-11-17 21:40:00
【问题描述】:
我将尝试 TDD,并且正在为此研究合适的工具。 在工作中,我们正在使用 MS Fakes,因此最好不要更改它并使用带有 TDD 的 MS Fakes。 但我有一个严重的问题。在我看来,MS Fakes 旨在用于以下场景:编写代码 -> 为其编写单元测试。如何在 TDD 期间使用 MS Fakes 模拟某些接口?
例如,我在 one 文件中有以下代码(稍后将进行重构)
[TestClass]
public class MyTests
{
[TestMethod]
public void ShouldReturnSomeResultIfEmptyCollectionOfCustomersWasReturned()
{
// arrange
ICustomerRepository customerRepository = null;
var targetService = new MyTargetService(customerRepository);
// act
int result = targetService.MyMethod();
// assert
Assert.AreEqual(1, result);
}
}
public class MyTargetService : IMyTargetService
{
private readonly ICustomerRepository customerRepository;
public MyTargetService(ICustomerRepository customerRepository)
{
this.customerRepository = customerRepository;
}
public int MyMethod()
{
if (customerRepository.GetCustomers().Any())
{
return 0;
}
return 1;
}
}
public interface IMyTargetService
{
}
public interface ICustomerRepository
{
Customer[] GetCustomers();
}
public class Customer
{
}
在我的 TDD 过程中,我将所有内容都放在一个文件中,然后将对其进行重构并移至不同的程序集。但我需要在这个地方模拟内联ICustomerRepository customerRepository = null;。例如,我可以使用 NSubstitute 轻松完成。但是,如果我使用 MS Fakes,我首先需要将此界面移动到另一个项目,请从单元测试所在的项目中引用该项目,然后按“添加假程序集”。这似乎是非常复杂的工作流程,这使得 TDD 变得不那么快速和高效。
我希望在没有所有这些奇怪操作的情况下就可以编写这样的代码:
ICustomerRepository customerRepository = new StubBase<ICustomerRepository>
{
GetCustomers = () => Enumerable.Empty<Customer>().ToArray(),
};
但是StubBase<> 是抽象的。那么有没有办法用 MS Fakes 做这样的事情呢?
【问题讨论】:
-
我在写代码之前写测试。经过几次测试 -> 代码 -> 重构后,我发布了结果代码。
标签: unit-testing tdd microsoft-fakes