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

时间:2009-09-02 09:09:38

标签: c# unit-testing rhino-mocks

是否可以在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)。

3 个答案:

答案 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”的值。