gpt4 book ai didi

c# - Moq - 如何验证属性值是否通过 setter 设置

转载 作者:IT王子 更新时间:2023-10-29 03:56:22 24 4
gpt4 key购买 nike

考虑这个类:

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.
}
}

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
}

第二次测试由于错误的原因而通过。那么我如何使用模拟 (moq) 来验证 CheckIn 是否正在设置 IsCheckedOut 属性?

谢谢。

编辑

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

您会在上面的测试代码中看到,即使我没有将属性值设置为 false,测试也会返回 false;这是意料之中的,这里没有问题。

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

我相信一些评论建议做一些相当于状态验证的事情?如果是这样,当我们可以简单地使用时,我认为模拟这部分根本没有任何值(value):

Content c = new Content();    
c.CheckIn();
Assert.AreEqual(false, c.IsCheckedOut); //State verification

当然我可能是错的,所以请帮我理清这些概念:)

最佳答案

以下应该有效。将您的模拟对象配置为:

var mock=new Mock<IContent>();
mock.SetupSet(content => content.IsCheckedOut=It.IsAny<bool>()).Verifiable();

测试代码之后:

mock.VerifySet(content => content.IsCheckedOut=It.IsAny<bool>());

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

编辑。事实上,这不会起作用,因为 IsCheckedOut 的 setter 是 false。

无论如何,现在我看到您从未在类构造时设置 IsCheckedOut 的值。将以下内容添加到 Content 类中是个好主意:

public Content()
{
IsCheckedOut=false;
}

关于c# - Moq - 如何验证属性值是否通过 setter 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com