2016-04-21 22 views
1

我测试我的课在嘲笑对象通过验证设置

public class myclass 
{ 
    private IAwesome awesomeObject; 
    public myclass(IAwesome awesomeObject) 
    { 
    this.awesomeObject = awesomeObject; 
    } 


    public void MethodUnderTest() 
    { 
     this.awesomeObject.RunSomething(); //I want to verify that RunSomething was called 
    } 
} 

我这样做的方法是:

//Arrange 
var mockAwesome = new Mock<IAwesome>(); 
mockAwesome.Setup(x=>x.RunSomething()).Returns ... Verify()...; 
//Act 
var sut = new myclass(mockAwesome.object); 
sut.MethodUnderTest(); 
//Assert 
mockAwesome.Verify(); 

我得到的例外是:

System.NotSupportedException:表达式引用 不属于模拟对象的方法:x => x.RunSomething

难道不可能测试一个特定的方法是在我传入一个类的模拟对象上执行的,它现在是该类的私有成员的一部分吗?

+0

将设置行修改为'mockAwesome.Setup(x => x.RunSomething())。Verifiable()',它应该适用于您提供的示例。要确认,请在示例类中注释掉'this.awesomeObject.RunSomething()'并运行测试。它会失败,因为你将'RunSomething'设置为'Verifiable()'并且它没有被使用。 – Nkosi

回答

1

修改设置线mockAwesome.Setup(x=>x.RunSomething()).Verifiable()和它应该工作您提供的例子。

[TestClass] 
public class MoqVerificationTest { 
    [TestMethod] 
    public void Moq_Should_Verify_Setup() { 
     //Arrange 
     var mockAwesome = new Mock<IAwesome>(); 
     mockAwesome.Setup(x => x.RunSomething()).Verifiable(); 
     //Act 
     var sut = new myclass(mockAwesome.Object); 
     sut.MethodUnderTest(); 
     //Assert 
     mockAwesome.Verify(); 
    } 

    public interface IAwesome { 
     void RunSomething(); 
    } 

    public class myclass { 
     private IAwesome awesomeObject; 
     public myclass(IAwesome awesomeObject) { 
      this.awesomeObject = awesomeObject; 
     } 
     public void MethodUnderTest() { 
      this.awesomeObject.RunSomething(); //I want to verify that RunSomething was called 
     } 
    } 
} 

要确认,在样品类注释掉this.awesomeObject.RunSomething()并再次运行测试。它会失败,因为您将RunSomething设置为Verifiable()并且它未被使用。

1

测试时,工作对我来说完全没有问题......

试试这个办法看看是否有什么不同的结果...

void Main() 
{ 
    IAwesome awesome = Mock.Of<IAwesome>(); 
    Mock<IAwesome> mock = Mock.Get(awesome); 
    mock.Setup(m => m.RunSomething()); 

    MyClass myClass = new MyClass(awesome); 
    myClass.MethodUnderTest(); 

    mock.Verify(m => m.RunSomething(), Times.Once); 
} 

public interface IAwesome 
{ 
    void RunSomething(); 
} 

public class MyClass 
{ 
    private IAwesome awesomeObject; 

    public myclass(IAwesome awesomeObject) 
    { 
     this.awesomeObject = awesomeObject; 
    } 

    public void MethodUnderTest() 
    { 
     this.awesomeObject.RunSomething(); 
    } 
}