我将尝试 TDD,并且正在为此研究合适的工具。在工作中,我们使用的是 MS Fakes,因此最好不要更改它并使用带有 TDD 的 MS Fakes。但我有一个严重的问题。在我看来,MS Fakes 旨在用于场景:编写代码->为其编写单元测试。如何在 TDD 期间使用 MS Fakes 模拟某些界面?
例如,我在一个文件中有以下代码(稍后将进行重构)
[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 做这样的事情呢?