unit-testing - 痣/假货 : How do I implement a test setup?

标签 unit-testing moles microsoft-fakes

我最近一直在与 Moles 合作,现在我正在转向 Fakes。在我的旧测试项目中,我有一个测试设置,如下所示:

[TestInitialize]
public void Setup()
{
    //...
}

在那里我做了一些必要的设置,就像设置我的一些痣对象一样。

摩尔中的测试方法看起来像那样(还有 [HostType("Moles")] 指定它使用摩尔对象。
[TestMethod]
[HostType("Moles")]
public void MolesTestMethod()
{
    //...
}

现在,在 Fakes 中,他们不再使用 HostType 属性。相反,他们使用 ShimsContext,您可以在其中使用“模拟”类。它看起来像这样:
[TestMethod]
public void FakesTestMethod()
{
    using (ShimsContext.Create())
    {
        //...
    }
}

如果您不使用此上下文,您可能会收到一条错误消息。它基本上说在 FakesTestMethod 中有一个 ShimInvalidOperationException,你必须按照下面描述的方式使用 ShimsContext.Create()
-- C#:
using Microsoft.QualityTools.Testing.Fakes;

using(ShimsContext.Create())
{
    // your test code using Shims here
}

-- VisualBasic.NET
Imports Microsoft.QualityTools.Testing.Fakes

Using ShimsContext.Create
    ' your test code using Shims here
End Using  

所以我试图把我的设置调用放到那个上下文中,结果是这样的:
[TestInitialize]
public void Setup()
{
    using(ShimsContext.Create())
    {
        //...
    }
}

现在,如果我在我的 Setup 方法中使用这个上下文,那么在那里完成的所有设置都将在之后用完上下文,并且当单元测试实际上即将运行时将不再有效,这并不是我真正想要的一种测试设置方法。

我通过将 using 放入测试方法本身并在此上下文中和测试代码之前调用私有(private)设置方法来解决此问题。这个 setup 方法现在完成了所有的处理,这在 [TestInitialize] setup 方法之前做了。代码看起来像这样:
[TestMethod]
public void PerformActionFromConfigActionStateActionIdIsSet()
{
    using (ShimsContext.Create())
    {
        Setup();

        //...
    }
}

我现在对这个问题的问题是,这个解决方案完全“扼杀”了 [TestInitialize] 设置方法的想法。我必须将此代码复制到每个测试方法中,最重要的部分是:在此 Setup() 方法中创建的对象将为每个测试创建和销毁,这根本不理想!

有没有其他方法可以在 Fakes 中设置测试数据?任何帮助表示赞赏!

最佳答案

Using:

Defines a scope, outside of which an object or objects will be disposed.



通过调用 ShimsContext.Create() 创建 IDisposable 实例并用 using block 包装它。在初始化您的 Fakes 类并离开使用范围后,您的配置将被释放。

我建议创建 IDisposable 实例并在测试结束时手动调用 Dispose。

如果您想避免为每个测试创建上下文,我还建议使用 ClassInitialize 和 ClassCleanup 而不是 TestInitialize 和 TestCleanup,因为它应该足以为所有测试初始化​​一次 Shims。这只有在没有其他依赖项的情况下才有可能(请参阅 Oleg Sych 的回答)。
[TestClass]
public class TestClass1
{
    protected static IDisposable Context { get; set; }

    [ClassInitialize]
    public static void ClassInitialize(TestContext testContext)
    {
        // Create ShimsContext
        Context = ShimsContext.Create();

        // TODO: Additional setup
    }

    [ClassCleanup]
    public static void ClassCleanup()
    {
        Context.Dispose();
        Context = null;
    }

    [TestMethod]
    public void TestMethod1()
    {
        // Fakes should be initialized correctly here
    }

    [TestMethod]
    public void TestMethod2()
    {
        // Fakes should be initialized correctly here
    }
}

希望有帮助。

关于unit-testing - 痣/假货 : How do I implement a test setup?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12017711/

相关文章:

tfs - 警告无法解析构建服务器上的 Moles dll

visual-studio - Fakes 是否会像 Moles 一样在 'Ultimate' 以外的 Visual Studio 版本上可用?

unit-testing - Visual Studio 2013 Update 4 更改 MSFakes Shim 对象默认行为

java - 是否可以只运行一个测试类(利用 PowerMock 和 Mockito)?

c# - 我如何使用 MS Moles 从地鼠那里引发事件?

moles - Microsoft Moles 不会为具有过时成员的类型生成 Stub 或 Mole

microsoft-fakes - Pex 在 Visual Studio 2015 中仍然很好

unit-testing - 如何使用 Jest 仅模拟一个测试文件的模块?

c++ - 给定一个 QTableWidgetItem,如何设置它的 column() 返回值?

ruby-on-rails - 使用 Factory_girl 建立测试中关联