即使是简单的Moq代码也会抛出NotSupportedException

时间:2016-11-27 11:37:31

标签: c# unit-testing moq

我一直在努力使用Moq作为模拟框架并复制了一些非常简单的示例代码。我一定在这里错过了一些非常愚蠢的东西。它会在Setup调用上抛出NotSupportedException,即使它指向Returns方法。此代码是我的测试类的一部分:

class Test
{
    public string DoSomethingStringy(string s)
    {
        return s;
    }
}

[TestInitialize]
public void Setup()
{
    var mock = new Mock<Test>();
    mock.Setup(x => x.DoSomethingStringy(It.IsAny<string>()))
        .Returns((string s) => s.ToLower());
}

2 个答案:

答案 0 :(得分:5)

异常错误消息可以提示您问题是什么:

  

非虚拟(在VB中可覆盖)成员的无效设置

这意味着当你模拟一个类的方法时,你只能在抽象或虚拟时模拟它(在你的情况下它既不是)。

所以最简单的解决方法是将方法设为虚拟:

public virtual string DoSomethingStringy(string s)
{
    return s;
}

答案 1 :(得分:2)

您可以使用typemock隔离器模拟非虚拟对象,并且可以轻松地更改源代码。

只需创建测试对象的虚假实例,并确定测试方法的新行为。

例如,我已经为您发布的代码创建了一个测试:

  [TestMethod]
        public void TestMethod1()
        {
            var mock = Isolate.Fake.Instance<Test>();
            Isolate.WhenCalled(() => mock.DoSomethingStringy(null)).DoInstead(contaxt =>
            {
                return (contaxt.Parameters[0] as string).ToLower();
            });

            var res = mock.DoSomethingStringy("SOMESTRING");

            Assert.AreEqual("somestring", res);
        }