C# 用setter注入模拟接口的MOQ

C# 用setter注入模拟接口的MOQ,c#,testing,nunit,moq,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

请输入下面的代码片段

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
    }
}
公共类文件上载演示器
{
专用IFileRepository文件存储库
{
获取{return UnityManager.Resolve();}
}
公共void加载数据(int-id)
{
//如何将下面的ReadData调用重定向到testcase中的mock方法?绕过FileRepository getter?
List fileModelList=FileRepository.ReadData(Id);
//对数据做点什么
}
}
我的单元测试用例

[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();
    }
[TestMethod]
公共void TestMethod1()
{
var mock=new mock();
FileModelfm=新的FileModel();
fm.FileId=1;
fm.FileName=“abc”;
fm.PolicyTxnId=10;
List fml=新列表();
fml.Add(fm);
mock.Setup(item=>item.ReadData(10)).Returns(fml);
FileUploadPresenter FileUploadPresenterRobj=新的FileUploadPresenter();
obj.LoadData();
}

在这里,我的模拟代码并没有真正起作用。我如何设置模拟,使调用类的接口方法调用击中被模拟的方法?这里我的接口属性是私有的,并且是只读的。

我认为您需要向
UnityManager
注册模拟实例。模拟实例存储在模拟的
对象
属性中

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

    // ..
}
[TestMethod]
公共void TestMethod1()
{
var mock=new mock();
UnityManager.RegisterInstance(mock.Object);
// ..
}

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

您在这里实现的是服务定位器模式,因此很难进行测试

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