使用TypeMock模拟静态函数

时间:2012-10-26 12:22:51

标签: mocking tdd typemock typemock-isolator

我正在尝试在我的项目中模拟静态函数。我无法使用Rhynomocks这样做,因此尝试使用Typemock模拟静态函数。

他们说使用typemock模拟静态函数是可能的,下面的文章中提供了相同的例子

http://www.typemock.com/basic-typemock-unit-testing

然而它似乎对我不起作用。以下是我的代码:

  

公共类Class1Test
      {
          [Isolated(Design = DesignMode.Pragmatic)]
          [测试]
          public void function()
          {               Isolate.Fake.StaticMethods(Members.MustSpecifyReturnValues);

        Isolate.WhenCalled(() => LoggerFactory.Add(6, 4)).WillReturn(11);

        int value = LoggerFactory.Add(5, 6);
    }


}

----------------------------------------------- LoggerFactory.cs

公共类LoggerFactory     {

    public static  int Add(int intx, int inty)
    {
        return intx + inty;
    }

}

我得到的错误是:

* 在InterfaceOnly设计模式下,无法伪造非虚方法。使用[Isolated(DesignMode.Pragmatic)]伪造这个。点击此处了解详情http://www.typemock.com/isolator-design-mode

提前致谢。

2 个答案:

答案 0 :(得分:1)

你为什么要先尝试模拟?你的方法不需要嘲笑,因为它是无状态的 - 只需直接测试它:

[Test]
public void Six_Plus_Five_Is_Eleven()
{
    Assert.That(11, Is.EqualTo(LoggerFactory.Add(6, 5));
}

答案 1 :(得分:0)

您的示例代码看起来不完整。我只是使用你的代码将一个略微修改的复制放在一起,它工作正常。具体而言,Isolate.Fake.StaticMethods调用缺少您打算进行模拟的类型。

using System;
using NUnit.Framework;
using TypeMock.ArrangeActAssert;

namespace TypeMockDemo
{
  public class LoggerFactory
  {
    public static int Add(int intx, int inty)
    {
      return intx + inty;
    }
  }

  // The question was missing the TestFixtureAttribute.
  [TestFixture]
  public class LoggerFactoryFixture
  {
    // You don't have to specify DesignMode.Pragmatic - that's the default.
    [Isolated(Design = DesignMode.Pragmatic)]
    [Test]
    public void Add_CanMockReturnValue()
    {
      // The LoggerFactory type needs to be specified here. This appeared
      // missing in the example from the question.
      Isolate.Fake.StaticMethods<LoggerFactory>(Members.MustSpecifyReturnValues);

      // The parameters in the Add call here are totally ignored.
      // It's best to put "dummy" values unless you are using
      // WithExactArguments.
      Isolate.WhenCalled(() => LoggerFactory.Add(0, 0)).WillReturn(11);

      // Note the parameters here. No WAY they add up to 11. That way
      // we know you're really getting the mock value.
      int value = LoggerFactory.Add(100, 200);

      // This will pass.
      Assert.AreEqual(11, value);
    }
  }
}

如果您可以将该代码粘贴到项目中(使用Typemock和NUnit引用)并且它不起作用,那么您可能在执行测试时遇到麻烦,或者您的计算机上可能存在配置错误。在任何一种情况下,如果上述代码不起作用,您可能希望联系Typemock支持。