gpt4 book ai didi

c# - NSubstitute 使用一个类的真实实例作为替代,除了一个方法

转载 作者:行者123 更新时间:2023-11-30 12:38:47 24 4
gpt4 key购买 nike

NSubstitute 中是否有任何内置方法可以使用其实例模拟类,除了少数方法?

在示例中,我想保留实例的全部功能,但检查是否使用特定参数调用方法。

我确实这样做了

public class Wrapper: IInterface
{
public IInterface real;
public IInterface sub;

public void Wrapper(IIterface realInstance, IIterface nsubstitute)
{
real = realInstance;
sub = nsubstitute;
}

public void MethodThatShouldWorkAsAlways()
{
real.MethodThatShouldWorkAsAlways();
}

public intMethodToBeTested(int a)
{
return sub.MethodToBeTested();
}
}

这样做的原因是我测试的东西足够复杂以至于我不能简单地手动创建包装器,这既耗时又容易出错。如果 Nsubstitute 允许这样的事情就好了:

IIterface realMock = NSubstitute.Mock< IIterface>( new RealClass());

realMock.MethodThatShouldWorkAsAlways(); // regular logic
realMock.MethodToBeTested(4).Returns( 3); // overrides the method to always returns 3

但到目前为止我还没有找到任何相关文档。

最佳答案

如果我对你的情况的理解正确,你有一个你正在测试的类,它采用 IIterface作为一个依赖,你想确保 MethodToBeTested(int)您正在测试的类正在调用方法。

这可以使用 .ForPartsOf<T>() 来完成生成模拟的方法。这会生成一个“部分模拟”,除非您提供覆盖,否则它将调用底层类实现。不过,它有一个很大的要求:您想要覆盖(或确保被调用)的方法必须是 virtual (或 abstract 如果在基类中定义)。

一旦有了模拟,就可以使用 .Received()断言模拟上的方法已被调用(或未被调用,如果您使用 .DidNotReceive() )。

您实际上不需要覆盖 MethodToBeTested(int) 的行为如果您希望使用基本实现。

这是一个基于您的示例代码的具体示例:

对于依赖项,您有一个 RealClass实现接口(interface) IIterface你想确保 MethodToBeTested(int)被称为。所以这些可能看起来像这样:

public interface IIterface
{
void MethodThatShouldWorkAsAlways();
int MethodToBeTested(int a);
}

public class RealClass: IIterface
{
public void MethodThatShouldWorkAsAlways()
{ }

public virtual int MethodToBeTested(int a)
{ return a; }
}

然后你有你实际测试的类,它使用 IIterface作为依赖:

public class ClassThatUsesMockedClass
{
private readonly IIterface _other;

public ClassThatUsesMockedClass(IIterface other)
{
_other = other;
}

public void DoSomeStuff()
{
_other.MethodThatShouldWorkAsAlways();

_other.MethodToBeTested(5);
}
}

现在,您想测试 DoSomeStuff()实际上调用MethodToBeTested() ,因此您需要创建 SomeClass 的部分模拟然后使用 .Received()验证它被称为:

    [Test]
public void TestThatDoSomeStuffCallsMethodToBeTested()
{
//Create your mock and class being tested
IIterface realMock = Substitute.ForPartsOf<RealClass>();
var classBeingTested = new ClassThatUsesMockedClass(realMock);

//Call the method you're testing
classBeingTested.DoSomeStuff();

//Assert that MethodToBeTested was actually called
realMock.Received().MethodToBeTested(Arg.Any<int>());

}

关于c# - NSubstitute 使用一个类的真实实例作为替代,除了一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49882760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com