私は TDD を試すつもりであり、そのための適切なツールを研究しています。職場では MS Fakes を使用しているため、変更せずに TDD で MS Fakes を使用しても問題ありません。しかし、私には深刻な問題が 1 つあります。MS Fakes はシナリオで使用することを意図しているように思えます: write code -> write unit test for it。MS Fakes を使用して TDD 中にインターフェイスをモックするにはどうすればよいですか?
たとえば、1つのファイルに次のコードがあります(リファクタリングは後で行われます)
[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 プロセスでは、すべてを 1 つのファイルにまとめてから、これをリファクタリングして別のアセンブリに移動します。しかし、この場所でインラインをモックする必要がありICustomerRepository customerRepository = null;
ます。たとえば、NSubstitute を使用すると簡単に実行できます。ただし、MS Fakes を使用する場合は、最初にこのインターフェイスを別のプロジェクトに移動し、単体テストが配置されているプロジェクトからこのプロジェクトを参照して、[Add Fake Assembly] をクリックする必要があります。これは非常に複雑なワークフローのように思われるため、TDD はそれほど迅速かつ効率的ではありません。これらの奇妙な操作をすべて行わずに、次のようなコードを配置したいと思います。
ICustomerRepository customerRepository = new StubBase<ICustomerRepository>
{
GetCustomers = () => Enumerable.Empty<Customer>().ToArray(),
};
StubBase<>
抽象的ですが。それで、MS Fakesでそのようなことをする方法はありますか?