微软假装:试图填充一个类,但依赖仍然存在

时间:2014-07-18 15:35:55

标签: c# .net unit-testing legacy-code microsoft-fakes

好的,所以这里有一笔交易:我有一个复杂的,严重依赖的班级LegacyClass,我想要垫片,以便在单元测试其他部件时摆脱所有依赖关系代码库。该类已经在其默认构造函数中创建了依赖项,因此我需要使用没有外部依赖项的东西来覆盖它,例如,使用空的默认构造函数。这就是我尝试做的事情(使用Visual Studio 2013专业测试框架):

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

namespace MyApp_Unit_Tests {
    [TestClass]
    public class UnitTest1 {
        [TestMethod]
        public void TestInstantiation1() {
            using (ShimsContext.Create()) {
                MyNamespace.Fakes.ShimLegacyClass.Constructor = x => { };
                var legacyClassInstance = new MyNamespace.Fakes.ShimLegacyClass();
                var sut = new MyNamespace.Gui.ViewModels.MainWindowViewModel(legacyClassInstance);
            }
        }
    }
}

然而,这不起作用。当MainWindowViewModel被实例化时,由于某些原因,仍然需要所有相同的外部依赖项,就像使用原始类一样!为什么呢?

我得到的例外是System.BadImageFormatException,所以我可能对目标CPU设置也有一些困惑,但无论如何根本原因是它试图加载外部DLL仅在其默认构造函数中的原始(非shimmed)遗留类中引用,而我认为它不再应该。

显然我被误解了,但错误在哪里?毕竟,即使使用Shims,我是否可以覆盖默认构造函数,或者我的方法是错误的?我错过了什么?

提前感谢一百万人提出建议!

-Seppo

1 个答案:

答案 0 :(得分:1)

我有同样的问题,我解决了它可能这种方法可以帮助你

 using (ShimsContext.Create()) 
 {

  LegacyClass obj=new LegacyClass();
  ShimLegacyClass shimobj=new ShimLegacyClass(obj);

  //
  // modify every thing you want on shimobj
  //

  shimobj.InstanceBehavior = ShimBehaviors.Fallthrough;

  //rest of test
  }

这种方法可以帮助您打破所需的每个部分的依赖关系,并使其余部分与主类相同