[英]Rhino Mocks: How to verify that a constructor was called
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)。
简短答案 :不,这不是Rhino Mocks(或我认为的任何模拟框架)的工作方式。
更长的答案 :您实际上并没有正确执行此操作。 使用工厂的几个原因之一是,您可以在创建新对象时进行模拟-这意味着您将在模拟FooFactory并为其他对象的测试提供模拟。 也许您的工厂中有很多逻辑也想接受测试-考虑将这些逻辑分为另一个类,例如可以单独测试的构建器。
我认为您无法做到所要求的。 但是,如果
Foo(int, int)是Foo上唯一的构造函数,则可以简单地声明返回的IFoo对象的类型,即
Foo f = (Foo)fooReturnedFromFactory; Assert.AreEqual(1, f.X); Assert.AreEqual(2, f.Y);
如果有多个构造函数,则必须检查返回对象的某些外部状态:
\n Foo f =(Foo)fooReturnedFromFactory;\n Assert.AreEqual(1,fX);\n Assert.AreEqual(2,fY);\n
不要以为您可以测试构造函数是否直接运行。
但是您可以间接测试它。 例如,如果将属性“ A”设置为5,则可以测试属性“ A”的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.