【发布时间】:2016-10-20 22:11:24
【问题描述】:
Moq 新手,这是一个非常简单的示例。我想模拟对我的方法“string getCode(int someID)”中使用的“int SmokeTest(int a,int b)”方法的调用。 SmokeTest 的变量在 getCode 中声明和设置。问题是当我模拟对smokeTest 的方法调用时,我总是在getCode 中得到“0”的结果,但我想看到我的预定义结果“20”。我发现的唯一解决方法是重载方法并传入所有变量。但是,我不想这样做,因为我想测试的许多方法都声明和使用局部变量。使用 Moq 测试此方法的最佳方法是什么?谢谢
// Example A
public string getCode(int someID)
{
int x = 5;
int y = 5;
int z = _dataAccess.smokeTest(x, y);
return _dataAccess.getCode(someID);
}
// NOTE: Doesn't work as wanted
[Test]
public void test_getCode_TestB()
{
var x = It.IsAny<int>();
var y = It.IsAny<int>();
// NOTE: "20" is not returned, 0 is returned instead because local variables are used
_mockDataAccess.Setup(m => m.smokeTest(x, y)).Returns(20);
_mockDataAccess.Setup(m => m.getCode(234)).Returns("def345");
var result = _businessLogic.getCode(234);
Assert.IsTrue(result == "def345");
}
// Example B
// NOTE: Workaround - pass in variables
public string getCode(int someID, int a, int b)
{
var c = _dataAccess.smokeTest(a, b);
return _dataAccess.getCode(someID);
}
[Test]
public void test_getCode_TestC()
{
var x = It.IsAny<int>();
var y = It.IsAny<int>();
// NOTE: "20" is returned as wanted
_mockDataAccess.Setup(m => m.smokeTest(x, y)).Returns(20);
_mockDataAccess.Setup(m => m.getCode(234)).Returns("def345");
var result = _businessLogic.getCode(234, x, y);
Assert.IsTrue(result == "def345");
}
【问题讨论】:
-
替换为 var y 后是否仍然工作错误?
标签: c# unit-testing moq