私はあなたがモックを利用しているので、ユニットテストについて話していると仮定しています。
あなたがテストしているクラスが依存している最初のレベルのインターフェイスよりも深く黙らせる必要はありません。あなたの例では、あなたのcontroller
は、インターフェイスに依存して、IRepository
を呼び出します。あなたのの実装のIRepository
は、IDbContext
になります。あなたがIRepository
のインタフェースを嘲笑している限り、前の文の太字/斜体に注意してください。IDbContext
はどのような関係もありません。IDbContext
は具体的なリポジトリの依存関係ですが、IRepository
は依存しません。
IRepository
には、コントローラの単体テストに関連するデータ/ビヘイビアを模倣するためにコントローラが必要とするすべてのものが必要です。
例:テストMyController
の目的のために
public class MyController : MyController
{
private readonly IRepository _repo;
public MyController(IRepository repo)
{
_repo = repo;
}
public IActionResult GetData(string userId)
{
var data = _repo.GetUserInformation(userId);
var someTransformation = null; // transform data
return View(someTransformation);
}
}
public interface IRepository
{
MyObject GetData(string userId);
}
public class Repository : IRepository
{
private readonly IDbContext _iDbContext;
public Repository(IDbContext iDbContext)
{
_iDbContext = iDbContext;
}
public MyObject GetUserInformation(string userId)
{
return _iDbContext.MyObjects.Where(w => w.UserId == userId);
}
}
public interface IDbContext
{
// impl
}
public class DbContext : IDbContext
{
// impl
}
、あなたはインターフェイスIRepository
に依存しています。 IRepository
(Repository
)の実装が依存するのは、MyController
のテストの対象外ですあなたのテストで
:上記のテストで
public class MyControllerTests
{
public void MyTest()
{
Mock<IRepository> mockRepo = new Mock<IRepository>();
mockRepo
.Setup(s => s.GetUserInformation(It.IsAny<string>())
.Returns(new MyObject()
{
UserId = "whatever", // or whatever the mocked data needs to be
DateCreated = DateTime.MinValue
});
}
}
、我々はGetUserInformation
が呼び出されたときにIRepository
が返すサンプルデータを提供している、我々はIRepository
として、でも実際DbContext
に依存しない、またはIDbContext
単に「GetUserInformationが文字列で呼び出されたときにMyObjectを返す」という契約を定義します。それをどうするかは問題ではありません。
ここで、いくつかのコードサンプルを共有してください。コミュニティがあなたの正確なシナリオを理解し、より直接的な助けを得るのを助けます:)。 – davidallyoung