【问题标题】:Other than mocked method call actual methods for a mock object除了模拟方法调用模拟对象的实际方法
【发布时间】:2020-02-07 07:18:13
【问题描述】:
IFoo
{
    string abc();
    string def();
}

Foo: IFoo
{
    string abc()
    {
        def();
    }

    string def()
    {
    }
}

Mymainclass
{
    private IFoo _foo;

    public Mymainclass():this(new Foo())
    {}

    public Mymainclass(IFoo foo)
    {
        _foo = foo;
    }

    string mainmethod()
    {
        _foo.abc();
    }
}

[TestClass]
public class Mymainclasstester
{
    Mymainclass mainclass;
    Mock<IFoo> mifoo;

    [TestInitialize]
    public void TestInitialize()
    {
        mifoo = new Mock<IFoo>();
        mifoo.Setup(x => x.def(It.IsAny<string>())).Returns("abc");
        mainclass = new Mymainclass(mifoo.Object);
    }

    [TestMethod]
    public void testmethod()
    {
        mainclass.mainmethod();
    }
}

正如上面在 testmethod() 中看到的,我正在调用 Mymainclass 类的 mainmethod(),而后者又调用 Foo 类的 abc()。 abc() 调用 def() ,如上面的代码所示。我只嘲笑了def()。 当从 testmethod() 调用时,我想对 Foo 的 abc() 进行实际调用,并且只模拟 def()。

目前使用此实现 abc() 未执行。

谁能帮我解决这个问题?

【问题讨论】:

  • 您可以设置abc 来调用def,但目前还不清楚您为什么要这样做,似乎不是正确的方法......类似:mock.Setup(x =&gt; x.abc()).Returns(() =&gt; mock.Object.def());
  • Moq 不知道你是如何在它的派生类(即 Foo)中实现 IFoo 接口的,这就是它抛出异常的原因。

标签: c# unit-testing moq


【解决方案1】:

您无法使用interface 归档您想要的内容。实际上,您可以通过模拟abc 来调用def,这似乎有点尴尬:

mock.Setup(x => x.abc()).Returns(() => mock.Object.def());

虽然我不明白这里的重点,但你可以模拟 abc 来代替......


使用 mock 归档您想要的内容的唯一方法是使用实​​际的 classCallbase 功能。

public class Foo : IFoo
{
    public virtual string abc() //methods have to be virtual to be mockable
    {
        return def();
    }

    public virtual string def() //methods have to be virtual to be mockable
    {
        return "123";
    }
}

//setup
var mock = new Mock<Foo>();
mock.Setup(x => x.def()).Returns("abc");
mock.Setup(x => x.abc()).CallBase();

mock.Object.abc(); // "abc"

在这种情况下,您设置的是实际类而不是接口,因此您需要重构一些实现。不确定这是否是实现您的要求的正确方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    相关资源
    最近更新 更多