我想知道爲什麼嘲笑以這種方式表現(我使用的是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
我想到了一個更深一點的問題,並更新了我的答案。我將不得不進入源代碼來真正驗證,但我相當肯定我的答案 –