好的,所以这里有一笔交易:我有一个复杂的,严重依赖的班级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
答案 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
}
这种方法可以帮助您打破所需的每个部分的依赖关系,并使其余部分与主类相同