jam*_*nto 47 nunit moq autofixture
我正在尝试验证使用期望的对象参数调用mock中的方法.我正在使用Moq,nUnit,并认为AutoFixture的Likeness应该完成工作.以下是我正在尝试做的简化版本.
有没有办法用AutoFixture做到这一点?有没有更好的方法来验证是否Something
使用适当的参数调用?
在A
类中重写Equals 以比较属性值并将Verify
行更改为:
barMock.Verify(m => m.Something(a));
Run Code Online (Sandbox Code Playgroud)
传递,但是我宁愿不在我的项目中像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
}
}
}
Run Code Online (Sandbox Code Playgroud)
nem*_*esv 75
Verify
默认情况下,在Moq中检查参数的引用相等性,以便它只在您Equals
在测试和实现中提供相同的实例(除非您已覆盖)时才会通过.
在你的情况下,expectedA.Value
just返回new A { P1 = 1 }
在测试中创建的,当然这与创建的实例不同DoSomethingWith
.
你需要使用Moq的It.Is
构造来正确地测试它而不会覆盖Equals
(实际上你根本就不需要Autofixture):
barMock.Verify(m => m.Something(It.Is<A>(arg => arg.P1 == a.P1)));
Run Code Online (Sandbox Code Playgroud)
但是如果你有多个属性,比如P1,P2,P3 ... AutoFixture可以是有用的:
barMock.Verify(m => m.Something(It.Is<A>(arg => expectedA.Equals(a))));
Run Code Online (Sandbox Code Playgroud)
因为您不需要手动为所有属性写出eqaulity检查.
如果升级到AutoFixture 2.9.1(或更高版本),则可以在Likeness实例上调用CreateProxy方法,该方法将为目标类型发出动态代理.
生成的动态代理使用Likeness覆盖Equals,这简化了语法(非常多).
这是原始测试方法,修改为使用Likeness代理:
[Test]
public void TestSample()
{
var foo = new Foo();
var barMock = new Mock<IBar>();
var expected = new A().AsSource().OfLikeness<A>().CreateProxy();
expected.P1 = 1;
foo.DoSomethingWith(barMock.Object);
Assert.True(expected.Equals(foo.Data)); // passes
barMock.Verify(m => m.Something(expected)); // passes
}
Run Code Online (Sandbox Code Playgroud)
请注意,它还使测试断言比接受Any实例更具体.
您可以在此处找到有关此新功能的更多详细信息.
归档时间: |
|
查看次数: |
29727 次 |
最近记录: |