我的测试方法中是否存在Stub或Shim方法?

时间:2013-06-05 19:00:04

标签: c# unit-testing microsoft-fakes stubs

我的测试方法中有一个方法base.ResolveDate()来自基类及其公共和虚拟。我想用自己的方法存根/ shim这个方法,所以我是stub还是shim? Stub或Shim,我该怎么做呢?从我对MS Fakes的经验来看,它似乎是一个Stub,因为 Stub只能影响可覆盖的方法。 - ALM 2012

以下是测试方法:

public override DateTime ResolveDate(ISeries comparisonSeries, DateTime targetDate)
    {
        if (comparisonSeries == null)
        {
            throw new ArgumentNullException("comparisonSeries");
        }

        switch (comparisonSeries.Key)
        {               
            case SeriesKey.SomeKey1:
            case SeriesKey.SomeKey2:
            case SeriesKey.SomeKey3:
            case SeriesKey.SomeKey4:
            case SeriesKey.SomeKey5:
                return DateHelper.PreviousOrCurrentQuarterEnd(targetDate);
        }

        return base.ResolveDate(comparisonSeries, targetDate);
    }

这是我想要Stub / Shim的基类的方法吗?

public virtual DateTime ResolveDate(ISeries comparisonSeries, DateTime targetDate)
    {            
        if (this.key == comparisonSeries.Key)
            return targetDate;

        return DateHelper.FindNearestDate(targetDate, comparisonSeries.AsOfDates);
    }

2 个答案:

答案 0 :(得分:2)

要从与其基本实现隔离的方法测试派生方法,您需要对其进行填充。鉴于以下受测系统:

namespace ClassLibrary7
{
    public class Parent
    {
        public virtual string Method()
        {
            return "Parent";
        }
    }

    public class Child : Parent
    {
        public override string Method()
        {
            return base.Method() + "Child";
        } 
    }
}

您可以为Child.Method()编写以下测试。

using ClassLibrary7;
using ClassLibrary7.Fakes;
using Microsoft.QualityTools.Testing.Fakes;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Test
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            using (ShimsContext.Create())
            {
                var child = new Child();

                var shim = new ShimParent(child);
                shim.Method = () => "Detour";

                string result = child.Method();

                Assert.IsFalse(result.Contains("Parent"));
                Assert.IsTrue(result.Contains("Detour"));
                Assert.IsTrue(result.Contains("Child"));
            }
        }
    }
}

请注意,前两个Assert仅用于说明父方法如何绕行。在实际测试中,只需要为子方法断言。

答案 1 :(得分:-1)

1)首先添加对要测试的实际dll的引用示例:ABC.Interfaces 2)然后展开你的引用和现在应该在你的引用中的实际dll右键单击并说“Add Fakes Assembly”

Visual Studio将处理引用,如果成功,你应该看到一个名为ABC.Interfaces.1.0.0.0.Fakes的新引用..

您现在可以看到存根和垫片已添加到您的方法中。

希望这有帮助!