C# Rhino Mocks:如何验证是否调用了构造函数
在Rhino.mock中是否可以验证是否调用了指定的构造函数 考虑以下代码:C# Rhino Mocks:如何验证是否调用了构造函数,c#,unit-testing,rhino-mocks,C#,Unit Testing,Rhino Mocks,在Rhino.mock中是否可以验证是否调用了指定的构造函数 考虑以下代码: 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) {
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();
}
}
我想验证Foo(int,int)是否由FooFactory调用。我认为您不能按要求执行。但是,如果Foo(int,int)是Foo上唯一的构造函数,那么您可以简单地断言返回的IFoo对象的类型,即 Foo(int, int) Assert.IsInstanceOfType(typeof(Foo), foo); Assert.IsInstanceOfType(typeof(Foo),Foo); 如果有多个构造函数,则必须检查返回对象的某些外部状态: Foo f = (Foo)fooReturnedFromFactory; Assert.AreEqual(1, f.X); Assert.AreEqual(2, f.Y); Foo f=(Foo)从工厂返回的食品; 断言。AreEqual(1,f.X); 主张平等(2,f.Y);
不要认为您可以测试构造函数是否直接运行
但是你可以间接地测试它。例如,如果将属性“A”设置为5,则可以测试属性“A”的值。简短回答:不,Rhino Mock(或我认为的任何模拟框架)不是这样工作的
更长的回答:你做得并不正确。使用工厂的几个原因之一是,当创建新对象时,您可以进行模拟-这意味着您将模拟您的FooFactory,并为其他对象的测试提供模拟。也许在你的工厂里,你有很多逻辑,你也希望得到测试——把这个逻辑分成另一个类,比如一个可以独立测试的建设者。同意。我强烈质疑是否需要测试一个特定的构造函数是否被调用。。。对我来说,这听起来太过分了。您应该测试的是工厂根据特定的输入产生预期的输出。