繁体   English   中英

替换“密封”类的实现

[英]Replace implementation of a “sealed” class

A是来自引用的dll的类,因此无法更改。 它有一个方法Foo() ,该方法在我的DoFoo()方法内部被调用(以A作为参数)。 我想在不执行Foo() DoFoo()情况下测试DoFoo() ,因为它很昂贵并且已经过测试。

在这种情况下,最佳做法是什么?

我对此的想法:

  • A周围创建包装器类,并将其传递到DoFoo() 包装器类区分真实的和假的实现。
  • 使用扩展方法也可以做到这一点。
  • 使用dynamic并通过一个空的DoFoo()实现传递一个伪类。

创建一个包含要公开的方法的接口。

创建一个实现该接口并使用外部程序集的类完成其工作的包装器类。 您可以创建此接口的其他实现,例如模拟实现。

例如,将带有构造函数注入的接口注入需要功能的类中。

在测试中,您可以轻松地将使用外部库的实现替换为模拟实现。

实际上,使用Typemock做到这一点非常容易,您无需使用包装器或创建接口,只需对其进行模拟即可。 例如:

被测方法:

public string DoFoo(A a)
    {
        string result = a.Foo();
        return result;
    }
}

sealed public class A
{
    public string Foo()
    {
        throw new NotImplementedException();
    }
}

测试:

[TestMethod,Isolated]
public void TestMethod1()
{
    var a = Isolate.Fake.Instance<A>(Members.CallOriginal);

    Isolate.WhenCalled(() => a.Foo()).WillReturn("TestWorked");

    var classUnderTest = new Class1();
    var result = classUnderTest.DoFoo(a);

    Assert.AreEqual("TestWorked", result);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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