【发布时间】:2015-11-05 18:16:43
【问题描述】:
我有课
public class Foo
{
public Foo(IBar bar)
{
//...
}
public virtual int GetValue(){}
public virtual DoActual()
{
...
var value = GetValue();
...
}
}
我需要测试一下。我想覆盖 GetValue 方法并将特定值返回给调用者。 这是我的测试代码:
[TestMethod]
public void Test()
{
var mock = new Mock<Foo>{ CallBase=true}; // problem is here
mock.Setup(x=>x.GetValue()).Returns(1);
mock.DoActual();
//asserts
}
由于我的 Foo 类构造函数具有依赖项,我必须将其传递给对象初始化程序。 Moq 提供将参数传递给 params[] 重载:
[TestMethod]
public void Test()
{
var barMock= new Mock<IBar>();
var mock = new Mock<Foo>(barMock){ CallBase=true}; // problem is still here
mock.Setup(x=>x.GetValue()).Returns(1);
mock.DoActual();
//asserts
}
当我以这种方式传递我的模拟时,我收到错误消息说 Moq.Mock`1[IBar] 不是 Foo 接受的构造函数。
当我将 barMock.Object 传递给构造函数时,我得到了不同类型的基本相同的错误:
"Could not find a constructor that would match given arguments:
Castle.Proxies.IBarProxy"
我卡在这个地方,不知道如何解决我的 Foo 类依赖项。
【问题讨论】:
-
将
barMock.Object传递给构造函数,而不是barMock。 -
请仔细阅读我的问题,这个方法我试过了
-
所以您基本上是想测试
DoActual调用GetValue?测试的意义何在? -
测试点不是个案。我在样本中添加了点,目的是只突出我的问题。我知道我的代码是“不良做法”书的一个很好的例子,但我目前无法重构它。现在我只需要写测试。
-
你试过简单地将它传递给 null 吗?
标签: c# .net unit-testing mocking moq