我想知道为什么嘲笑以这种方式表现(我使用的是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),而不是在第一次测试中以这种方式?
你能帮忙吗?这是我的第一篇文章,所以不要剧烈:)
关于CallBase设置好注意 –
谢谢。但是第一个失败了。 PackageId被构造函数初始化为-1,而.setupProperty不会为覆盖对象“覆盖”它。 – Artem
我想到了一个更深一点的问题,并更新了我的答案。我将不得不进入源代码来真正验证,但我相当肯定我的答案 –