gpt4 book ai didi

c# - 界面模拟上的 Moq CallBase

转载 作者:太空宇宙 更新时间:2023-11-03 12:33:54 27 4
gpt4 key购买 nike

假设我们有以下设置:

public interface IBase
{
void Foo();
}

public class Base : IBase
{
public virtual void Foo()
{
Console.WriteLine("Called Base.Foo()");
}
}

public interface IChild : IBase
{
void Bar();
}

public class Child : Base, IChild
{
public virtual void Bar()
{
Console.WriteLine("Called Child.Bar()");
}
}

当模拟 Child 时对象一切正常:

var child = new Mock<Child> { CallBase = true };

child.Object.Bar();
child.Object.Foo();

输出是:

Called Child.Bar()
Called Base.Foo()

但是在模拟 IChild 时界面 nothing 打印到控制台:

var child = new Mock<IChild> { CallBase = true };

child.Object.Bar();
child.Object.Foo();

假设我不能模拟 Child对象,因为没有无参数构造函数(依赖注入(inject))。

我知道我可以做到以下几点:

child.Setup(c => c.Bar()).Callback(() =>
{
// Copy paste bar-method body
});

child.Setup(c => c.Foo()).Callback(() =>
{
// Copy paste foo-method body
});

但是那会很丑。
是否有使用 Mock<IChild> 的干净解决方案?

最佳答案

只要您在模拟接口(interface),您就无法访问或了解有关真实类的信息,这就解释了为什么您没有获得任何输出(但我想您明白这一点)。

不幸的是,如果您选择模拟一个接口(interface)(根据定义,它没有行为),使事情发生的唯一方法是按照您的方式设置方法。

如果方法的内容仅使用公共(public)属性和方法,另一种“肮脏”的方法是对您的子类和基类使用方法扩展。

public static class ChildExtension
{
public static void Bar(this Child child)
{
Console.WriteLine("Called Child.Bar()");
}
}

关于c# - 界面模拟上的 Moq CallBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41725857/

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