最初またはデフォルトの顧客に戻る必要があると思います:
mock.Setup(m => m.GetById(IsAny<int>())).Returns<int>(
id =>
customersRepo.FirstOrDefault(c => c.Id == id)
);
また、モックでリポジトリ ロジックを再実装する必要がないことも覚えておいてください (これは奇妙で非常に脆弱です)。モックです。ロジックなしで、必要な結果をモックできます。
mock.Setup(m => m.GetById(42)).Returns<int>(new Customer { Id = 42 });
モックを使用してインタラクションを検証します。つまり、リポジトリのクライアントが、予期されるパラメーターで予期されるメソッドを呼び出したことを確認します。
あるサービスのビジネス ロジックをテストする場合、サービスはテスト対象のシステム (SUT) であり、モックを作成しないでください。ただし、サービスにビジネス ロジックとデータ アクセス ロジックの両方が含まれていると、処理が多すぎます。インターフェイスを実装するリポジトリ クラスにデータ アクセス ロジックを抽出します。
public interface ICustomerRepository
{
Customer GetById(int id);
// other methods related to customr data access
}
次に、サービスをこのインターフェイスに依存させます (依存関係の逆転)。
public class YourService
{
private readonly ICustomerRepository _repository;
// dependency injection
public YourService(ICustomerRepository repository)
{
_repository = repository;
}
public void ExecuteSomeBusinessLogic()
{
// your code will go here
}
}
次に、サービスのテストを作成します。したがって、サービスには依存関係 (顧客リポジトリ) が必要です。この依存関係をモックする必要があります。そして、サービスが期待どおりに依存関係と対話することを確認します。たとえば、ExecuteSomeBusinessLogic テストでは、サービスが ID が 42 の顧客を要求することを確認する必要があります (はい、奇妙なビジネス ロジックです)。
[Test]
public void ShouldPerformGoodStuffWhenCustomerFound()
{
// Arrange
var mockRepository = new Mock<ICustomerRepository>();
mockRepository.Setup(r => r.GetById(42)).Returns(new Customer { Id = 42 });
var service = new YourService(mockRepository.Object);
// Act
service.ExecuteSomeBusinessLogic();
// Assert
mockRepository.VerifyAll();
// check other stuff
}
カスタムがデータベースに見つからなかった場合のテストを作成する場合は、異なるリターンを設定するだけです:
mockRepository.Setup(r => r.GetById(42)).Returns(null);