2013-12-11 34 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

我想到了一个更深一点的问题,并更新了我的答案。我将不得不进入源代码来真正验证,但我相当肯定我的答案 –

相关问题