Moq单元测试 - 预期结果?

时间:2016-01-14 13:32:53

标签: c# unit-testing moq

我使用Moq进行单元测试并获得以下方法:

[TestMethod]
public void GetTestRunById_ValidId_TestRunReturned()
{
    var mockTestRunRepo = new Mock<IRepository<TestRun>>();
    var testDb = new Mock<IUnitOfWork>();

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

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

正在测试的方法是getTestRunByID()。我已经确认在调试此单元测试时会调用此方法,但正如预期的那样getTestRunByID()不会返回任何内容,因为模拟内部没有数据。

所有重要的是方法被命中并返回null吗?如果没有,当我的mockTestRunRepo仅作为testDb的返回值出现时,如何将数据添加到我的mockTestRunRepo中?

作为参考,正在测试的方法是:

public static TestRun getTestRunByID(IUnitOfWork database, int testRun)
{
    TestRun _testRun = database.TestRunsRepo.getByID(testRun);
    return _testRun;
}

2 个答案:

答案 0 :(得分:1)

单元测试的目的是仅测试小方法getTestRunByID。为此,测试是否使用整数参数1调用一次。

mockTestRunRepo.Verify(m => m.getByID(1), Times.Once());

您还必须为getByID设置方法mockTestRunRepo,使其返回特定值,并测试测试运行的结果值是否等于您的预期。

//instantiate something to be a TestRun object.
//Not sure if abstract base class or you can just use new TestRun()
mockTestRunRepo.Setup(m => m.getByID(1)).Returns(something);

测试您是否获得相同的值

TestRun returnedRun = EntityHelper.getTestRunByID(testDb.Object, 1);
Assert.AreEqual(returnedRun, something);

此代码可能容易出错,因为我现在没有可以测试它的环境。但这是单元测试背后的总体思路。

这样,您可以测试方法getById是否按预期运行,并返回预期结果。

答案 1 :(得分:0)

您的存储库返回数据与设置其他所有内容的方式相同。

var mockTestRunRepo = new Mock<IRepository<TestRun>>();

// This step can be moved into the individual tests if you initialize
// mockTestRunRepo as a Class-level variable before each test to save code.
mockTestRunRepo.Setup(m => m.getById(1)).Returns(new TestRun());

Per @ Sign的建议,如果您知道自己使用1进行了调用,请使用该代码而不是It.IsAny<int>()来保持清洁。