Moq - 如何验证通过setter设置的属性值

44 .net c# tdd moq mocking

考虑这个课程:

public class Content
{      
   public virtual bool IsCheckedOut {get; private set;}
   public virtual void CheckOut()
   {
      IsCheckedOut = true;
   }

   public virtual void CheckIn()
   {
      //Do Nothing for now as demonstrating false positive test.
   }
}
Run Code Online (Sandbox Code Playgroud)

Checkin方法故意为空.现在我有一些测试方法来验证调用每个方法的状态.

[TestMethod]
public void CheckOutSetsCheckedOutStatusToTrue()
{
    Content c = new Content();    
    c.CheckOut();
    Assert.AreEqual(true, c.IsCheckedOut); //Test works as expected
}

[TestMethod]
public void CheckInSetsCheckedOutStatusToFalse()
{
    Content c = new Content();
    c.CheckIn();
    Assert.AreEqual(false, c.IsCheckedOut); //Test does not work as expected
}
Run Code Online (Sandbox Code Playgroud)

第二次测试通过了错误的原因.那么我如何使用mocking(moq)来验证CheckIn是否设置了IsCheckedOut属性?

谢谢.

编辑

澄清一下:我有一个名为CheckIn()的方法,其工作是将IsCheckedOut状态设置为false.

您将在上面的测试代码中看到,即使我没有将属性值设置为false,Test也将返回false; 这是预期的,这里没有错.

我认为我的问题具体是如何验证CheckIn()方法是否将IsCheckedOut属性设置为false?这就是我所说的行为验证.

我相信一些意见建议做一些相当于国家核查的事情?如果是这样的话,我不相信当我们可以简单地使用时,嘲笑这部分是没有任何价值的:

Content c = new Content();    
c.CheckIn();    
Assert.AreEqual(false, c.IsCheckedOut); //State verification
Run Code Online (Sandbox Code Playgroud)

当然我可能错了,所以请帮我澄清这些概念:)

Kon*_*man 43

以下应该有效.将模拟对象配置为:

var mock=new Mock<IContent>();
mock.SetupSet(content => content.IsCheckedOut=It.IsAny<bool>()).Verifiable();
Run Code Online (Sandbox Code Playgroud)

并在测试代码之后:

mock.VerifySet(content => content.IsCheckedOut=It.IsAny<bool>());
Run Code Online (Sandbox Code Playgroud)

我还没有测试过,所以请告诉我它是否适合你.

编辑.实际上,这不会起作用,因为setter IsCheckedOut是假的.

无论如何,现在我看到你从未设定IsCheckedOut上课时间的价值.将以下内容添加到Content类中是个好主意:

public Content()
{
    IsCheckedOut=false;
}
Run Code Online (Sandbox Code Playgroud)


小智 19

Mock mockContect = new Mock<Cotent>(); 
mockContent.VerifySet(x => x.IsCheckedOut, Times.Once());
Run Code Online (Sandbox Code Playgroud)

这会诀窍吗?不知道私人制定者是如何进行游戏的.但适合我的公共制定者.

得到的信息来自:http://www.codethinked.com/post/2009/03/10/Beginning-Mocking-With-Moq-3-Part-2.aspx


Mar*_*ath 5

为什么不简单地设置要检出的内容开始呢?请记住,您只是在测试 CheckIn 函数的行为。

[TestMethod]
public void CheckInSetsCheckedOutStatusToFalse()
{
    // arrange - create a checked out item
    Content c = new Content();
    c.CheckOut();

    // act - check it in
    c.CheckIn();

    // assert - IsCheckedOut should be set back to false
    Assert.AreEqual(false, c.IsCheckedOut);
}
Run Code Online (Sandbox Code Playgroud)

  • 我同意在这种情况下不需要使用模拟(ing 框架)。这个建议的方法更好,因为它测试公共接口而不是内部细节(即如何设置属性)。 (2认同)