【问题标题】:Test: How to verify that a method is called?测试:如何验证方法是否被调用?
【发布时间】:2016-11-24 15:37:48
【问题描述】:

许多 Mock 框架具有验证方法是否被调用的功能。然而,大多数框架要求代码遵循依赖注入模式。

我尝试测试的代码不使用依赖注入模式,因此无法注入对象的模拟。

代码示例:

public class TestMeClass {
    public void TransformMe() { }
}

public abstract class SomeeClass {
    public SomeMethod() {
        CallMeMethod();
    }

    private void CallMeMethod() {
        TestMeClass testMeClass = new TestMeClass();
        testMeClass.TransformMe();
    }
}

如何验证(单元测试)TransformMe() 被调用?

可以使用反射来完成吗? (语言是 C#)

乔恩·斯基特我需要你。

【问题讨论】:

  • 该方法很难测试,因为依赖项是在父类本身中初始化的。
  • 这真的是不可能的。如果您想测试您的 SomeeClass Logic 是否正常运行,您将需要以某种方式注入 TestMeClass 的一个实例,以便您可以监视它的方法。
  • 我猜如果你使用mock 库你可以使用verify 方法。看this
  • 如果您只需要测试一次,我会使用 File.Write(...) 来检查该方法是否被调用。如果您需要进行单元测试,我建议您进行重构。
  • @esiprogrammer 否定

标签: c# unit-testing testing mocking


【解决方案1】:

如何验证(单元测试)TransformMe() 是否被调用?

没有。并非没有公开可以验证的内容。

只是为了说明一个观点而举一个非常糟糕的例子。

public abstract class SomeeClass{
   public SomeMethod(){
    CallMeMethod();
   }

   public bool TransformMeCalled {get;private set;}

   private void CallMeMethod() {
      TestMeClass testMeClass = new TestMeClass();
      testMeClass.TransformMe();
      TransformMeCalled = true;
   }
}

可以使用反射来完成吗? (语言是 C#)

再次,不。依赖项是在依赖类内部创建的,外部参与者不知道。外部接入点需要可用,否则这是不可测试的。你说的时候回答了问题

我尝试测试的代码不使用依赖注入 模式,因此无法注入对象的模拟。

一种选择是重构依赖项的创建,这将允许它被覆盖,但同样它必须暴露给外部参与者才能访问

public abstract class SomeeClass{
    public SomeMethod(){
        CallMeMethod();
    }

    public abstract TestMeClass CreateTestMeClass();

    private void CallMeMethod() {
        TestMeClass testMeClass = CreateTestMeClass();
        testMeClass.TransformMe();
    }
}

【讨论】:

    猜你喜欢
    • 2018-08-31
    • 2011-12-25
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多