我正在尝试验证是否使用预期的对象参数调用了模拟中的方法。我正在使用Moq,nUnit,并认为AutoFixture的“相似度”应该可以完成工作。
以下是我正在尝试做的简化版本。

有没有办法用AutoFixture做到这一点?有没有更好的方法来验证是否使用适当的参数调用了Something

覆盖A类中的Equals以比较属性值并将Verify行更改为:

barMock.Verify(m => m.Something(a));

通过,但是我不想在我的项目中在每个类(如A)中覆盖Equals。
namespace Test
{
    using Moq;
    using NUnit.Framework;
    using Ploeh.SemanticComparison.Fluent;

    public class A
    {
        public int P1 { get; set; }
    }
    public interface IBar
    {
        void Something(A a);
    }

    public class Foo
    {
        public A Data { get; private set; }
        public void DoSomethingWith(IBar bar)
        {
            Data = new A { P1 = 1 };
            bar.Something(Data);
        }
    }

    [TestFixture]
    public class AutoFixtureTest
    {
        [Test]
        public void TestSample()
        {
            var foo = new Foo();
            var barMock = new Mock<IBar>();
            var a = new A { P1 = 1 };
            var expectedA = a.AsSource().OfLikeness<A>();

            foo.DoSomethingWith(barMock.Object);

            expectedA.ShouldEqual(foo.Data);   // passes
            barMock.Verify(m => m.Something(expectedA.Value));  // fails
        }
    }
}

最佳答案

默认情况下,在Verify中,Moq将检查参数的引用相等性,以便仅在您在测试和实现中提供相同的实例(除非覆盖了Equals)时才通过。
在您的情况下,expectedA.Value仅返回测试中创建的new A { P1 = 1 },当然,它与DoSomethingWith中创建的实例不同。
您需要使用Moq的It.Is构造在不覆盖Equals的情况下对其进行正确的测试(事实上,您根本不需要Autofixture):

barMock.Verify(m => m.Something(It.Is<A>(arg => arg.P1 == a.P1)));
但是,如果您有多个属性,例如P1,P2,P3 ...,则AutoFixture可能会有用:
barMock.Verify(m => m.Something(It.Is<A>(arg => expectedA.Equals(a))));
因为您不需要手动写出所有属性的相等性检查。

关于nunit - 使用验证来确认Moq模拟类中的预期参数值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8883685/

10-08 22:26
查看更多