是否可以在Rhino.Mocks中验证是否调用了指定的构造函数?
请考虑以下代码:
public interface IFoo
{
void Bar();
}
public class FooFactory
{
public IFoo CreateInstance(int x, int y)
{
return new Foo(x, y);
}
}
public class Foo : IFoo
{
public Foo(int x, int y)
{
// ... blah
}
public void Bar()
{
// blah...
}
}
[TestFixture]
public class FooFactoryTest
{
[Test]
public void Assert_Foo_Ctor_Called_By_Factory_CreateInstance()
{
MockRepository mocks = new MockRepository();
using (mocks.Record())
{
Expect.Call( /* ???? */ );
}
using(mocks.Playback())
{
new FooFactory().CreateInstance(1, 2);
}
mocks.VerifyAll();
}
}
我想验证FooFactory是否调用了Foo(int,int)。
答案 0 :(得分:4)
简短回答:不,这不是Rhino Mocks(或我认为的任何模拟框架)的运作方式。
更长的答案:你并没有真正做到这一点。使用工厂的几个原因之一是,您可以模拟新对象的创建时间 - 这意味着您将模拟您的FooFactory并为其他对象的测试提供模拟。也许你的工厂中有很多逻辑你想要接受测试 - 考虑将这个逻辑分成另一个类,比如可以单独测试的构建器。
答案 1 :(得分:2)
我认为你不能做你所要求的。但是,如果
Foo(int, int)是Foo上唯一的构造函数,那么您可以简单地断言返回的IFoo对象的类型,即
Assert.IsInstanceOfType(typeof(Foo), foo);
如果有多个构造函数,那么你必须检查返回对象的某些外部状态:
Foo f = (Foo)fooReturnedFromFactory; Assert.AreEqual(1, f.X); Assert.AreEqual(2, f.Y);
答案 2 :(得分:0)
不要以为你可以测试构造函数是否直接运行。
但你可以间接测试它。例如,如果将属性“A”设置为5,则可以测试属性“A”的值。