我有一个 IUnitOfWork 接口(interface),它包含到我们所有存储库的映射,如下所示:

public interface IUnitOfWork : IDisposable
{
    IRepository<Client> ClientsRepo { get; }
    IRepository<ConfigValue> ConfigValuesRepo { get; }
    IRepository<TestRun> TestRunsRepo { get; }
    //Etc...
}

我们的 IRepository 类如下所示:
public interface IRepository<T>
{
    T getByID(int id);
    void Add(T Item);
    void Delete(T Item);
    void Attach(T Item);
    void Update(T Item);
    int Count();
}

我的问题是我正在尝试测试使用 getById() 的方法,但是该方法是通过 IUnitOfWork 对象访问的,如下所示:
public static TestRun getTestRunByID(IUnitOfWork database, int testRun)
{
    TestRun testRun = database.TestRunsRepo.getByID(testRun);
    return testRun;
}

在我的测试中,我 mock 了两件事; IUnitOfWorkIRepository 。我已经配置了 IRepository 以便它返回一个 TestRun 项,但是我实际上无法使用这个 repo,因为在 getTestRunByID() 方法中它从 IUnitOfWork 对象获取自己的 repo。结果,这会导致 NullReferenceException

我曾尝试将我的存储库添加到 IUnitOfWork 的存储库中,但它无法编译,因为所有存储库都标记为 { get; } 只要。我的测试是:
[TestMethod]
public void GetTestRunById_ValidId_TestRunReturned()
{
    var mockTestRunRepo = new Mock<IRepository<TestRun>>();
    var testDb = new Mock<IUnitOfWork>().Object;
    TestRun testRun = new TestRun();
    mockTestRunRepo.Setup(mock => mock.getByID(It.IsAny<int>())).Returns(testRun);

    //testDb.TestRunsRepo = mockTestRunRepo; CAN'T BE ASSIGNED AS IT'S READ ONLY

    TestRun returnedRun = EntityHelper.getTestRunByID(testDb, 1);
}

如何让我的 IUnitOfWork's 存储库不抛出 NullReferenceException

最佳答案

您不能分配给模拟,您需要通过 Setup.properties 配置属性。

代替:

testDb.TestRunsRepo = mockTestRunRepo;

尝试:
testDb.Setup(m => m.TestRunsRepo).Returns(mockTestRunRepo.Object);

或者
testDb.SetupGet(m => m.TestRunsRepo).Returns(mockTestRunRepo.Object);

关于c# - 模拟一个接口(interface)是 { get;仅(起订量),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34789144/

10-13 08:39