看看传递给Mock的是什么?

时间:2017-10-25 21:41:31

标签: c# unit-testing moq

我有一个大多数工作单元测试,它检查一个方法被调用,它工作正常。但是,我想检查传递给该方法的参数。使用Verify我可以检查是否传递了一组特定的参数,但如果没有传递这些参数并且测试失败,是否有办法查看实际传递给方法的内容?

示例:

sut.Setup(x => x.MyMethod(It.IsAny<myClass>()).Verifiable();
sut.Object.DoAThing();
sut.Verify(x => x.MyMethod(It.Is<myClass>(v => v.thing == 1)));

在我的测试中,这将失败(v.thing将不是1),但我想知道的是,v.thing设置为什么?我想知道,因为我发现这种反馈在调试代码和单元测试时非常有用。

我得到的错误只是说从未调用过x.MyMethod(带有那些预期的参数)。

有解决方案吗?我错过了一些明显的东西吗

说明我的观点的最小例子:

public class myClass
{
    public struct myStruct {
        public int thing;
    }
    public virtual void MyMethod(myStruct x )
    {
        // Code goes here
    }
}

public class sutClass
{
    public myClass target = new myClass();
    public void DoAThing()
    {
        myClass.myStruct toBePassed = new myClass.myStruct { thing = 8 };

        target.MyMethod(toBePassed);
    }
}

[TestMethod]
public void Test1()
{
    Mock<myClass> mMyClass = new Mock<myClass>();
    sutClass sut = new sutClass();
    sut.target = mMyClass.Object;

    mMyClass.Setup(x => x.MyMethod(It.IsAny<myClass.myStruct>())).Verifiable();

    sut.DoAThing();

    mMyClass.Verify(x => x.MyMethod(It.Is<myClass.myStruct>(v => v.thing == 1)));
}

上述简单测试显然会失败。

Expected invocation on the mock at least once, but was never performed: x => x.MyMethod(It.Is<myStruct>(v => v.thing == 1))

我希望看到的是WAS传递给MyMethod的输出结果是什么是预期和实际发生的差异。很像Assert.AreEqual(expected, actual)会回来。 (例如,期望的字符串和实际的字符串)。

1 个答案:

答案 0 :(得分:2)

您可以在模拟设置中实现回调:

foreach($picture in (get-childitem d:\test)){
    Rename-Item $picture.fullname 
    -NewName (($picture.name -replace " ", "_") +$count+$picture.Extension)

此处将值设置为passedValue并打印到控制台