我有这堂课:
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.Mock1.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上提出的问题吗?这是否超出范围?
答案 0 :(得分:1)
您的问题与方法调用中的参数不匹配:this.valueClass
默认情况下不等于new ValueClass(value1, value2)
,因为它将是ValueClass
的两个不同实例。默认情况下,两个实例将通过引用进行比较,这些实例是不同的。你可以:
Equals
中的GetHashCode
和ValueClass
方法,以更改两个实例的比较方式。即按值进行比较,而不是按引用进行比较。It.Any<ValueClass>()
忽略此参数。如果您不关心ValueClass
的具体值并且只是想要检查方法,那就太好了。并不总是最好的选择ValueClass
的值:It.Is<ValueClass>(vc => vc.Value1 == VALUE1 && vc.Value2 == VALUE2)
。有时它也很好。例如。如果你不能覆盖Equals
。但它使测试的可读性更低。