2016-11-27 47 views
1

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

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

您可以模拟非虚拟对象与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); 
     } 
3

异常错误消息,可以给你一个暗示什么问题是:

非虚拟(重写在VB)成员

上无效的设置

这意味着当你嘲笑某个类的方法时,如果是抽象的或虚拟的(在你的情况下它不是),你只能嘲笑它。

因此最简单的解决将是使该方法虚:

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

同样的'class'必须是'public'('internal'是OK只有你有一个适当的'某处InternalsVisibleToAttribute' )。 –

相关问题