使用Moq框架模拟方法不会返回预期结果

时间:2018-06-21 08:00:29

标签: c# unit-testing moq mstest

我有一个类库,其中包含2个类和一个接口,如下所示。
主班:

    public class Class1 
    {
        int a=5 ,b=9;
        private Interface1 iHelper;
        public Class1(Interface1 _inter)
        {
            iHelper = _inter;
        }
        public int getData()
        {
            int result = iHelper.AddNumbers(a, b);
            return result;
        }

    }

HelperClass类:

class HelperClass : Interface1
    {
        public int AddNumbers(int a, int b)
        {
            return a + b;
        }
    }

接口:

public interface Interface1
    {
        int AddNumbers(int a, int b);
    }

现在,我正在尝试测试方法getData()。我已经使用AddNumbers模拟了Moq方法,如下所示。

[TestMethod()]
public void getDataTest()
{
     int a = 3, b = 5;
     int c = 8;
     var mockService = new Mock<Interface1>();
     mockService.Setup(x => x.AddNumbers(a,b)).Returns(c);

     Class1 obj = new Class1(mockService.Object);
     var result = obj.getData();
     int final = result;
 } 

当我调试此测试时,它返回值0。
据我了解,当我们模拟任何方法时,它必须在测试时返回模拟值。在这种情况下,我将AddNumbers方法的返回值模拟为8,因此它应该返回8,但是,它返回0。

谁能解释我在做什么错

EDIT :实际上,Class1中ab的值是动态的。在示例代码中,我已经对其进行了硬编码。而且,我不想测试AddNumbers方法。我希望它无论如何都返回一些固定值。在这种情况下,我希望它返回8。

2 个答案:

答案 0 :(得分:5)

您可以在模拟期望中使用明确的数字指定对AddNumbers的呼叫。仅当将这些显式值赋予AddNumbers时,才返回8。如果您不关心AddNumbers的实际参数,则需要通过忽略参数的方式(例如通过It.IsAny<>)指定期望值

mockService.Setup(x => x.AddNumbers(It.IsAny<int>(),It.IsAny<int>())).Returns(c);

另请参见https://github.com/Moq/moq4/wiki/Quickstart部分“匹配参数”。

答案 1 :(得分:3)

由于Class1中的变量abgetDataTest中定义的变量不同。使用相同的值:

[TestMethod()]
public void getDataTest()
{
     int a = 5, b = 9; // here
     int c = 14; // and here
     var mockService = new Mock<Interface1>();
     mockService.Setup(x => x.AddNumbers(a,b)).Returns(c);

     Class1 obj = new Class1(mockService.Object);
     var result = obj.getData();
     int final = result;
 }