【问题标题】:Verifying set with another mock returns null用另一个 mock 验证 set 返回 null
【发布时间】:2013-10-23 01:33:06
【问题描述】:

模拟框架:起订量
测试框架:NUnit

我觉得对此有一个简单的答案,但我只是忽略了它,但我一生都无法弄清楚为什么这让我感到悲伤。

我在这里有两个模拟,我正在尝试验证被测单元是否将一个模拟的属性设置为另一个模拟的属性,如下所示:

[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;
  }
}

当我运行这个测试时,它会在 VerifySet 返回一个错误,上面写着:

预期在模拟上至少调用一次,但从未执行:t => t.Val = (String)null

但在这之下,说:

执行的调用:ITwo.Val = "test"

所以我确定ITwo.Val 在我的Controller 中设置为IOne.Val,但我必须在此处为VerifySet 设置错误的模拟。我可以直接用字符串替换VerifySet,例如:

mockTwo.VerifySet(t =&gt; t.Val = testString);

并且测试将通过。由于mockOne.Object.ValSetupGet 以返回testString,我不太明白为什么我不能在VerifySet 中使用mockOne.Object.Val 代替testString

【问题讨论】:

    标签: c# nunit moq


    【解决方案1】:

    我不确定为什么 mockOne.Object.Val 在 VerifySet 的上下文中返回 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));
    }
    

    希望这会有所帮助。

    【讨论】:

    • 太棒了,我什至没有想过使用 It.Is。我必须弄清楚为什么它不喜欢给它一个字符串 - 奇怪的是,我有另一组代码执行非常相似的机制,除了它比较位图,它确实允许 mock.Object.Bitmap正常返回!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多