【问题标题】:Is it possible to Assert a method has been called in VS2005 Unit Testing?是否可以断言在 VS2005 单元测试中调用了一个方法?
【发布时间】:2009-11-20 00:09:41
【问题描述】:

我正在编写一些单元测试,我需要能够根据设置数据断言是否已调用方法。

例如

 String testValue = "1234";
 MyClass target = new MyClass();
 target.Value = testValue;

 target.RunConversion();

 // required Assertion
 Assert.MethodCalled(MyClass.RunSpecificConversion);

然后会有第二个测试,其中 testValue 为空,我想断言该方法尚未被调用。


针对特定测试场景的更新:

我有一个类,它表示从 XML 反序列化的信息。这个类包含一些我需要转换成我自己的类的信息。

XML 类是关于一个人的信息,包括帐户信息和不同字段中的一些电话号码。

我有一个从 XML 类创建我的 Account 类的方法,以及一个从 XML 类创建正确电话类的方法。我对这些方法中的每一个都进行了单元测试,但我想测试当调用帐户转换时,它会运行电话转换,因为结果实际上是帐户类的属性。

我知道我可以在输入正确信息后测试帐户类的属性,但是我还有其他嵌套属性,这些属性进一步嵌套并且测试整个树可能变得非常麻烦。我想我可以让每个级别测试它下面的下一个级别,但理想情况下,我想确保调用了正确的转换方法并且代码没有在实现中重复。

【问题讨论】:

    标签: c# unit-testing visual-studio-2005


    【解决方案1】:

    如果不使用 Moq、TypeMock、RhinoMocks 等可以验证您的期望的 Mocking 框架,我会考虑解析堆栈跟踪。

    MSDN documentation here 应该会有所帮助。

    善良,

    【讨论】:

    • 你知道更简单的例子吗?
    【解决方案2】:

    您想调查模拟框架的使用。

    或者您可以创建自己的假对象来记录通话。您需要创建该类实现的接口。

    我见过的一种制造假货的方法如下:

    interface MyInterface
    {
        void Method();
    }
    
    // Real class
    class MyClass : MyInterface
    {
    }
    
    // Fake class for recording calls
    class FakeMyClass : MyInterface
    {
        public bool MethodCalled;
        public void Method()
        {
            this.MethodCalled = true;
        }
    }
    

    然后,您需要在运行测试时使用一些依赖注入来使用这个假类而不是真实类。

    当然,这样做的问题是 Fake 类只会记录方法调用,但实际上不会做任何真实的事情。这并不总是适用的。它在 Model-View-Presenter 环境中运行良好。

    【讨论】:

      【解决方案3】:

      您可以使用类似Rhino Mocksmoq 的模拟框架。您也可以使用像 Isolator 这样的隔离框架来做到这一点。

      另一种选择是继承您要验证的类,并在其中引发一个标志,表明该方法已被调用。而不是针对标志的测试断言中的断言。 (基本上它是一个手卷模拟)

      使用隔离器的示例:

      Isolate.Verify.WasCalledWithAnyArguments(() => target.RunSpecificConversion());
      

      免责声明 - 我在 Typemock 工作

      【讨论】:

        【解决方案4】:

        另一种观点 - 你可能在太低的水平上进行单元测试,这可能会导致你的测试变得脆弱。

        通常,最好测试业务需求而不是实现细节。例如您使用“1234”作为输入运行转换,并且转换应该反转输入,因此您期望“4321”作为输出。

        不要测试您期望“1234”通过特定的步骤序列进行转换。将来您可能会更改实现细节,即使仍然满足业务需求,测试也会失败。

        当然,您在问题中的测试可能是实际的业务需求,在这种情况下它是正确的。

        您想要执行此操作的另一种情况是,如果在真正的 MyClass 中调用转换不适合单元测试,即需要大量设置,或者需要大量时间。然后你需要模拟或存根它。


        回复问题编辑:

        根据您的情况,我仍然倾向于通过检查输出而不是检查是否调用了特定方法来进行测试。

        您可以使用不同的 XML 输入进行测试,以确保必须调用不同的转换方法才能通过测试。

        而且我不会依赖测试来检查是否有重复代码,而是会在遇到重复代码时重构掉它,只依赖单元测试来确保代码在之后仍然执行相同的功能重构。

        【讨论】:

          猜你喜欢
          • 2013-03-18
          • 2011-04-19
          • 1970-01-01
          • 2013-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多