2013-12-11 36 views
2

我想知道爲什麼嘲笑以這種方式表現(我使用的是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),而不是在第一次測試中以這種方式?

你能幫忙嗎?這是我的第一篇文章,所以不要劇烈:)

回答

7

所有mockable(virtual)方法使用默認的代理,所以這就是爲什麼你會得到第二次測試的默認值(0)(代理不組)。不過,你可以通過在你的模擬上設置CallBase = true來解決這個問題。

CallBase = true將使用默認實現(如果可用),而不是嘗試模擬一切。

我花了一秒鐘找出的第一個失敗的原因,我認爲,這是因爲SetupProperty只打開一個默認值跟蹤和因爲你是覆蓋在構造函數的默認值,那麼是什麼用來。如果你想強制一個值,那麼你需要使用Setup(x=>x.PackageId).Returns(SamplePackageId)SetupGet

+0

關於CallBase設置好注意 –

+0

謝謝。但是第一個失敗了。 PackageId被構造函數初始化爲-1,而.setupProperty不會爲覆蓋對象「覆蓋」它。 – Artem

+0

我想到了一個更深一點的問題,並更新了我的答案。我將不得不進入源代碼來真正驗證,但我相當肯定我的答案 –

相關問題