C#Nunit Moq无法进行测试通过

时间:2017-01-17 15:15:11

标签: c# unit-testing nunit moq ncrunch

我有这堂课:

class MyClass
{
    private ISomeInterface blabla;

    public MyClass() : this(new SomeInterfaceImplementation()) {}

    internal MyClass(ISomeInterface blabla)
    {
        this.blabla = blabla;
    }

    public void SomeMethod(string id, int value1, int value2)
    {
        this.blabla.DoSomethingWith(id, new ValueClass(value1, value2))
    }
}

我也有这个测试:

[TestFixture]
public class MyClassTest
{
    private const string ID = "id";
    private const int VALUE1 = 1;
    private const int VALUE2 = 2;

    private ValueClass valueClass;

    private Mock<ISomeInterface> mockInterface;

    private MyClass myClass;

    [SetUp]
    public void SetUp()
    {
        this.valueClass = new ValueClass(VALUE1, VALUE2);
        this.mockInterface = new Mock<ISomeInterface>();
        this.myClass = new MyClass(this.mockInterface.Object);
    }

    [Test]
    public void GIVEN_AnID_AND_AValue1_AND_AValue2_WHEN_DoingSomeMethod_THEN_TheSomeInterfaceShouldDoSomething()
    {
        this.myClass.SomeMethod(ID, VALUE1, VALUE2);
        this.mockInterface.Verify(m => m.DoSomethingWith(ID, this.valueClass), Times.Once()); //<- Test fails here!
    }
}

我不知道为什么,但我无法通过此测试。 NCrunch给了我以下错误消息:

  

Moq.MockException:模拟一次的预期调用,但是为0   次:m =&gt; m.DoSomethingWith(&#34; ID&#34;,。valueClass)没有设置   构造

     

执行调用:

     

ISomeInterface.DoSomethingWith(&#34; ID&#34 ;,   MyNamespace.ValueClass)at   Moq.Mock.ThrowVerifyException(MethodCall expected,IEnumerable 1 setups, IEnumerable 1 actualCalls,Expression expression,Times times,   Int32 callCount)在Moq.Mock.VerifyCalls(拦截器   targetInterceptor,MethodCall expected,Expression expression,Times   时间)在Moq.Mock.Verify [T](模拟1 mock, Expression 1表达式,   Moq.Mock 1.Verify(Expression 1的时间,字符串failMessage)   表达,时代)   Tests.MyClassTest.GIVEN_AnID_AND_AValue1_AND_AValue2_WHEN_DoingSomeMethod_THEN_TheSomeInterfaceShouldDoSomething()   在   C:\ MySourceCode \文件和行号。

正如你所看到的,似乎Moq是&#34;没有看到&#34;我的调用,可能是因为new ValueClass(value1, value2)如何让这个测试通过,或者我如何更改我的设计以便更容易测试?我应该在哪里放new ValueClass(value1, value2)

修改

这是一个我应该在软件工程而不是StackOverflow上提出的问题吗?这是否超出范围?

1 个答案:

答案 0 :(得分:1)

您的问题与方法调用中的参数不匹配:this.valueClass默认情况下不等于new ValueClass(value1, value2),因为它将是ValueClass的两个不同实例。默认情况下,两个实例将通过引用进行比较,这些实例是不同的。你可以:

  • 覆盖Equals中的GetHashCodeValueClass方法,以更改两个实例的比较方式。即按值进行比较,而不是按引用进行比较。
  • 使用It.Any<ValueClass>()忽略此参数。如果您不关心ValueClass的具体值并且只是想要检查方法,那就太好了。并不总是最好的选择
  • 使用谓词手动检查ValueClass的值:It.Is<ValueClass>(vc => vc.Value1 == VALUE1 && vc.Value2 == VALUE2)。有时它也很好。例如。如果你不能覆盖Equals。但它使测试的可读性更低。