繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM