【问题标题】:Rhino Mocks: How to verify that a constructor was calledRhino Mocks:如何验证构造函数是否被调用
【发布时间】:2009-09-02 09:09:37
【问题描述】:

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

  }

}

我想验证 Foo(int, int) 是否被 FooFactory 调用。

【问题讨论】:

    标签: c# unit-testing rhino-mocks


    【解决方案1】:

    简答:不,Rhino Mocks(或我认为的任何模拟框架)不是这样工作的。

    更长的答案:您并没有真正正确地做到这一点。使用工厂的几个原因之一是您可以在创建新对象时进行模拟 - 这意味着您将模拟您的 FooFactory 并为其他对象的测试提供模拟。也许您的工厂中有很多逻辑您也想进行测试 - 考虑将该逻辑分离到另一个类中,例如可以单独测试的构建器。

    【讨论】:

    • 同意。我强烈质疑是否需要测试一个特定的构造函数被调用......对我来说听起来像是过度规范。您应该测试的是工厂根据特定输入产生预期的输出。
    【解决方案2】:

    我认为你不能按照你的要求去做。但是,如果

    Foo(int, int)
    是 Foo 上唯一的构造函数,那么您可以简单地断言返回的 IFoo 对象的类型,即 Assert.IsInstanceOfType(typeof(Foo), foo);

    如果有多个构造函数,那么你必须检查返回对象的一些外部状态:

    Foo f = (Foo)fooReturnedFromFactory; 断言.AreEqual(1, f.X); 断言.AreEqual(2, f.Y);

    【讨论】:

      【解决方案3】:

      不要以为直接运行构造函数就可以测试。

      但你可以间接测试它。例如,如果将属性“A”设置为 5,则可以测试属性“A”的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多