C# Rhino Mocks:如何验证是否调用了构造函数

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) {

在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)
  {
    // ... 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,并为其他对象的测试提供模拟。也许在你的工厂里,你有很多逻辑,你也希望得到测试——把这个逻辑分成另一个类,比如一个可以独立测试的建设者。

同意。我强烈质疑是否需要测试一个特定的构造函数是否被调用。。。对我来说,这听起来太过分了。您应该测试的是工厂根据特定的输入产生预期的输出。