使用Moles对紧密耦合的第三方DLL进行单元测试

时间:2012-08-09 06:22:20

标签: moles pex

我是PEX和Moles的新手,只是想知道如何使用类似于下面的鼹鼠的UnitTest。

我只需要一个UniDynArray来测试。但是创建UniDynArray取决于UniSession和UniSession取决于UniObjects.OpenConnection。当我运行此代码时,我收到来自ThirdParty dll的错误,说会话未打开

请帮忙

[TestMethod, HostType("Moles")]
    public void Constructor2WithMoles()
    {
        using (MolesContext.Create())
        {
            //Should I make the Third party session like this ???
            MUniSession msession = new MUniSession();

            //Here What Actually Happens in the code is uniObject opensession return session
            // UniSession session = UniObjects.OpenSession(a,b,c,d); How should i do this
           //???? MUniObjects.OpenSessionStringStringStringString = (a, b, c, d) => msession;

            MUniDynArray mdata = new MUniDynArray();

            mdata.InsertInt32Int32String = (column, index, strValue) =>
                                               {
                                                   column = 1;
                                                   index = 1;
                                                   strValue = "Personal Auto";
                                               };

            mdata.InsertInt32Int32String = (column, index, strValue) =>
                                               {
                                                   column = 2;
                                                   index = 1;
                                                   strValue = "1.1";
                                               };

            mdata.InsertInt32Int32String = (column, index, strValue) =>
            {
                column = 3;
                index = 1;
                strValue = "05/05/2005";
            };

            mdata.InsertInt32Int32String = (column, index, strValue) =>
            {
                column = 4;
                index = 1;
                strValue = "Some Description";
            };

            mdata.InsertInt32Int32String = (column, index, strValue) =>
            {
                column = 5;
                index = 1;
                strValue = "20";
            };

            mdata.InsertInt32Int32String = (column, index, strValue) =>
            {
                column = 6;
                index = 1;
                strValue = "1";
            };

            History target = new History(mdata, 1);

            Assert.AreEqual<string>("Some Description", target.Description);
        }
        // TODO: CREATE Mole asserts
    }

1 个答案:

答案 0 :(得分:0)

首先,我强烈建议您在.NET 4.5和Visual Studio 2012(2012年9月12日发布)中等待使用Fakes Stub Shim 类型。假货是Moles的产品化版本。要开始使用Fakes,download the free Ultimate version of VS2012 Release Candidate

要回答您的问题,您应该使用Dependency Injection design pattern来隔离您的第三方依赖关系。许多Shim / Mole类型的用户忽略了实现依赖注入模式 - 只有在没有其他选项时才使用Shim / Mole类型。我假设第三方库公开了接口。 Fakes / Moles自动将接口转换为可用于测试的Stub类型。您需要从接口创建具体的存根,以供生产代码使用。这些存根只是目标第三方库类型的包装器。查找有关依赖注入的任何文章,了解如何实现模式的详细信息 - 此模式可以快速轻松地实现,尤其是在使用重构工具时,例如ResharperRefactor!Pro。 p>

使用与Shim / Mole类型相同的lambda / delegate语法绕行Stub类型方法调用。存根类型适用于生成特定于单个或少量测试的存根。否则,创建一个用于多个测试的具体测试存根是最佳选择。