MOQ使用setter注入模拟接口

时间:2014-08-05 11:52:34

标签: c# testing nunit moq

请注明以下代码段

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();
    }

这里我的模拟代码并没有真正起作用。如何设置一个模拟这样一种方式,从我的调用类调用接口方法将命中模拟方法?这里我的接口属性是私有和只读。

2 个答案:

答案 0 :(得分:0)

我认为您需要使用UnityManager注册您的模拟实例。模拟的实例存储在模拟的Object属性中。

[TestMethod]
public void TestMethod1()
{
    var mock = new Mock<IFileRepository>();
    UnityManager.RegisterInstance<IFileRepository>(mock.Object);

    // ..
}

答案 1 :(得分:0)

你不应该以这种方式使用UnityManager。您的IFileRepository是一个依赖项,它应该注入到您的FileUploadPresenter中。

您在此处实施的是服务定位器模式,因此难以测试。

如果您将FileUploadPresenter更改为具有接收IFileRepository的构造函数。然后,您可以为测试模拟一个IFileRepository。