[英]MOQ mocking an interface with setter injection
請使用以下代碼段
public class FileUploadPresenter
{
private IFileRepository FileRepository
{
get { return UnityManager.Resolve<IFileRepository>(); }
}
public void LoadData(int id)
{
//How can I redirect the below ReadData call to Mocked method in the testcase ?bypassing the FileRepository getter ?
List<FileModel> fileModelList = FileRepository.ReadData(Id);
//Do something with the data
}
}
我的單元測試用例
[TestMethod]
public void TestMethod1()
{
var mock = new Mock<IFileRepository>();
FileModelfm = new FileModel();
fm.FileId = 1;
fm.FileName = "abc";
fm.PolicyTxnId = 10;
List<FileModel> fml = new List<FileModel>();
fml.Add(fm);
mock.Setup(item => item.ReadData(10)).Returns(fml);
FileUploadPresenter FileUploadPresenterobj = new FileUploadPresenter();
obj.LoadData();
}
在這里,我的模擬代碼無法正常工作。如何設置模擬,使調用類中的接口方法調用會擊中該模擬方法? 在這里,我的接口屬性是private和readonly。
我認為您需要向UnityManager
注冊UnityManager
實例。 模擬的實例存儲在模擬的Object
屬性中。
[TestMethod]
public void TestMethod1()
{
var mock = new Mock<IFileRepository>();
UnityManager.RegisterInstance<IFileRepository>(mock.Object);
// ..
}
您不應該以這種方式使用UnityManager。 您的IFileRepository是一個依賴項,應將其注入到FileUploadPresenter中。
您在這里實現的是服務定位器模式,因此很難進行測試。
如果您將FileUploadPresenter更改為具有采用IFileRepository的構造函數。 然后,您可以模擬一個IFileRepository進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.