我使用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;
}
答案 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>()
来保持清洁。