gpt4 book ai didi

c# - 使用不同的构造函数模拟对象

转载 作者:行者123 更新时间:2023-11-30 20:00:39 28 4
gpt4 key购买 nike

我试图理解为什么模拟会以这种方式运行(我将 NUnit 与 Moq 一起使用)。比方说,我们有一个简单的类:

public class Package
{
public virtual int PackageId { get; set; }

public Package()
:this(-1)
{
}

public Package(int packageId)
{
PackageId = packageId;
}
}

还有一些要讨论的简单测试:

[TestFixture]
public class NUnitTrickyTest
{
private const int SamplePackageId = 10;

[Test]
public void TestPackageSetUp_WhenMockedWithDefaultConstructor_ExpectSamplePackageIdSet()
{
var samplePackage = new Mock<Package>();

samplePackage.SetupProperty(x => x.PackageId, SamplePackageId);

Assert.AreEqual(SamplePackageId, samplePackage.Object.PackageId);
}

[Test]
public void TestPackageSetUp_WhenMockedWithParametrizedConstructor_ExpectSamplePackageIdSet()
{
var samplePackage = new Mock<Package>(SamplePackageId);

// samplePackage.SetupProperty(x => x.PackageId, SamplePackageId);

Assert.AreEqual(SamplePackageId, samplePackage.Object.PackageId);
}
}

第一个测试失败,因为 samplePackage.Object.PackageId 返回 -1,而不是预期的 10。据我了解,模拟 Package() 调用参数化构造函数,该构造函数使用默认值 -1 初始化属性。在第二个测试中,我们发现 samplePackage.Object.PackageId 返回 0。

首先我不明白为什么返回 0(在调试中我看到构造函数中传递了 10,但该属性仍然是 0 值)。第二个:如果我们取消注释这个命令 samplePackage.SetupProperty(x => x.PackageId, SamplePackageId) 在第二个测试中,它将成功。那么,为什么 SetupProperty 在这种情况下表现得如预期(属性返回 10),而在第一个测试中却不是这样呢?

你能帮忙吗?这是我的第一篇文章,所以不要太严厉 :)

最佳答案

默认情况下,所有可模拟(虚拟)方法都使用代理,因此这就是为什么您在第二次测试中获得默认值(0)(代理不是放)。不过,您可以通过在 mock 上设置 CallBase = true 来解决这个问题。

CallBase = true 将使用默认实现(如果可用)而不是尝试模拟所有内容。

我花了一秒钟才弄清楚第一个失败的原因,我相信这是因为 SetupProperty 仅使用默认值打开跟踪,并且因为您正在覆盖默认值然后构造函数就是所使用的。如果你想强制一个值,那么你需要使用 Setup(x=>x.PackageId).Returns(SamplePackageId)SetupGet

关于c# - 使用不同的构造函数模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20530278/

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