Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用另一个模拟验证集合将返回null_C#_Nunit_Moq - Fatal编程技术网

C# 使用另一个模拟验证集合将返回null

C# 使用另一个模拟验证集合将返回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

模拟框架:Moq
测试框架: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正确返回!