C# 使用另一个模拟验证集合将返回null
模拟框架:MoqC# 使用另一个模拟验证集合将返回null,c#,nunit,moq,C#,Nunit,Moq,模拟框架:Moq 测试框架:NUnit 我觉得这有一个简单的答案,我只是忽略了它,但我一辈子都不明白为什么这会给我带来悲伤 我这里有两个mock,我试图验证被测单元是否正在将一个mock的属性设置为另一个mock的属性,如下所示: [TestFixture] public class Testmock { protected Mock<IOne> mockOne; protected Mock<ITwo> mockTwo; protected Controll
测试框架:NUnit 我觉得这有一个简单的答案,我只是忽略了它,但我一辈子都不明白为什么这会给我带来悲伤 我这里有两个mock,我试图验证被测单元是否正在将一个mock的属性设置为另一个mock的属性,如下所示:
[TestFixture]
public class Testmock
{
protected Mock<IOne> mockOne;
protected Mock<ITwo> mockTwo;
protected Controller UnitUnderTest;
[SetUp]
public void Setup()
{
mockOne = new Mock<IOne>();
mockTwo = new Mock<ITwo>();
UnitUnderTest = new Controller(mockOne.Object, mockTwo.Object);
}
[Test]
public void Test1()
{
string testString = "test";
mockOne.SetupGet(o => o.Val).Returns(testString);
UnitUnderTest.CopyVal();
mockTwo.VerifySet(t => t.Val = mockOne.Object.Val);
}
}
public interface IOne
{
string Val { get; set; }
}
public interface ITwo
{
string Val { get; set; }
}
public class Controller
{
IOne one;
ITwo two;
public Controller(IOne one, ITwo two)
{
this.one = one;
this.two = two;
}
public void CopyVal()
{
two.Val = one.Val;
}
}
[TestFixture]
公共类Testmock
{
受保护的模拟一;
受保护的模拟模型2;
受保护控制器单元测试;
[设置]
公共作废设置()
{
mockOne=新Mock();
mockTwo=新Mock();
UnitUnderTest=新控制器(mockOne.Object、mockTwo.Object);
}
[测试]
公共void Test1()
{
string testString=“test”;
SetupGet(o=>o.Val).Returns(testString);
UnitUnderTest.CopyVal();
mockTwo.VerifySet(t=>t.Val=mockOne.Object.Val);
}
}
公共接口
{
字符串Val{get;set;}
}
公共接口ITwo
{
字符串Val{get;set;}
}
公共类控制器
{
伊奥尼一号;
它有两个;
公共控制员(IOne一号,ITwo二号)
{
这个1=1;
这个2=2;
}
public void CopyVal()
{
2.Val=1.Val;
}
}
当我运行此测试时,它在VerifySet
处返回一个错误,该错误表示:
应至少对模拟进行一次调用,但从未执行过:t=>t.Val=(String)null
但在这下面,他说:
执行的调用:ITwo.Val=“test”
因此,我确信ITwo.Val
正在我的控制器中设置IOne.Val
,但我必须在这里为验证集设置错误的模拟。我可以直接用字符串替换验证集,例如:
mockTwo.VerifySet(t=>t.Val=testString)代码>
测试就会通过。由于mockOne.Object.Val
是SetupGet
返回testString
,我不太明白为什么我不能使用mockOne.Object.Val
代替VerifySet中的testString
,VerifySet的上下文中mockOne.Object.Val返回null。我相信这与Moq内部实施有关(挖掘Moq来源可以揭示此类行为的原因)
但是,我可以告诉您如何更改测试以使其工作,而无需在VerifySet()中使用testString变量。您应该使用It.Is(x=>x==mockOne.Object.Val)而不是直接引用mock属性。请参阅下文:
[Test]
public void Test1()
{
string testString = "test";
mockOne.SetupGet(o => o.Val).Returns(testString);
UnitUnderTest.CopyVal();
mockTwo.VerifySet(t => t.Val = It.Is<string>(x => x == mockOne.Object.Val));
}
[测试]
公共void Test1()
{
string testString=“test”;
SetupGet(o=>o.Val).Returns(testString);
UnitUnderTest.CopyVal();
mockTwo.VerifySet(t=>t.Val=It.Is(x=>x==mockOne.Object.Val));
}
希望这能有所帮助。太棒了,我甚至没想过要用它。我必须弄清楚为什么它不喜欢给它一个字符串-奇怪的是,我还有另一组代码,它有一个非常类似的机制,除了比较位图,它允许mock.Object.Bitmap正确返回!