簡體   English   中英

最小起訂量(MOQ)模擬使用setter注入的接口

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM