2015-10-03 192 views
1

我在C#中使用了一些COM库,它绑定到特定的硬件,没有它就无法工作。在开发/测试计算机上,我没有那个硬件。这是使用库的方法是这样的:我可以模拟不可能实例化的对象吗?

using HWSysManagerLib; 
bool ProcessBias(HWSysManager systemManager, string hwPath) 
{ 
    int handle = systemManager.OpenConfiguration(hwPath); 
    ... 
    // some magic goes here 
    // return result 
} 

的问题是,我可以为测试方法和如何嘲笑HWSysManager?在HWSysManager中只有很少的方法,并且模拟它们的测试功能并不是问题。如果可能的话,一个很小的例子就是如何嘲笑它。

回答

5

你可以在这里使用适配器模式。

创建一个名为接口IHWSysManager

public interface IHWSysManager 
{ 
    int OpenConfiguration(string hwPath); 
} 

真正的实现类仅委派工作图书馆:

public class HWSysManagerImpl : IHWSysManager 
{ 
    private HWSysManager _hwSysManager; //Initialize from constructor 

    public int OpenConfiguration(string hwPath) 
    { 
     return _hwSysManager.openConfiguration(hwPath); 
    } 
} 

使用的界面在你的代码是这样的:

bool ProcessBias(IHWSysManager systemManager, string hwPath) 
{ 
    int handle = systemManager.OpenConfiguration(hwPath); 
    ... 
    // some magic goes here 
    // return result 
} 

现在你可以模拟你的IHWSysManager接口与莫ck框架,或者你可以自己创建一个存根类。

+0

所以改变我的应用程序是不可避免的。即使如此,我如何从我的应用程序中调用“ProcessBias”?现在我称之为:'HWSysManager sm = new HWSysManager(); ProcessBias(sm,“”);' – Pablo

+0

基本上我必须实现所有方法委托,我使用该库。 – Pablo

+0

您不应该在调用方法中创建实例。改为从构造函数中获取IHWSysManager。在你的开发机器中给出存根类作为参数,并在实际环境中给出真正的实现类。这种技术被称为依赖注入,你可以阅读关于它[这里](http://stackoverflow.com/questions/130794/what-is-dependency-injection)。 –

-1

我想你应该为你的模拟案例创建HWSysManager(或其他名称)类,添加一些想要的方法,然后嘲笑它们。例如:

class HWSysManager 
    { 
     public virtual int ExampleReturnIntMethod(int a) 
     { 
      var someInt = 0; 
      return someInt; 
     } 

,然后设置:

public void TestMethod() 
    { 
     Mock<HWSysManager> hwSysManager = new Mock<HWSysManager>(); 
     hwSysManager.Setup(x => x.ExampleReturnInMethod(It.IsAny<int>())).Returns(10); //if parameter is any of int, return 10 in this case 
    } 

然后使用您的嘲笑对象只使用 '对象' 属性:

var hwSysInstance = hwSysManager.Object; 
var result = hwSysInstance.ExampleReturnInMethod(2); //result will be 10 in this case - as we have mocked 

在壳体上方的方法/属性有是虚拟的。

可以使用接口也,你的情况:

public interface HwsysManager 
    { 
     int OpenConfiguration(string hwPath); 
    } 

    public void TestMethod() 
    { 
     Mock<HwsysManager> hwsysManager = new Mock<HwsysManager>(); 

     hwsysManager.Setup(x => x.OpenConfiguration(It.IsAny<string>())).Returns(10); 
    } 

这个模拟库的所有功能描述如下: https://github.com/Moq/moq4/wiki/Quickstart

+0

其实我需要测试使用'HWSysManager'的方法。所以如果我按照你的建议,我得到一个类型错误:无法从'Moq.Mock '转换为'HWSysManagerLib.HWSysManager'。在TestMethod中,我有'bool b = ClientProgram.ProcessBias(tcsm)'。 'tcsm是模拟对象。所以我怀疑在这里作弊是不可能的? – Pablo

+0

所以tcsm实际上是tcsm.Object,但仍然是相同的错误。 – Pablo

+0

此外,我在TestClass中有一个错误,那就是没有引用定义'HWSysManagerLib.HWSysManager'的程序集。 – Pablo

1

您可以使用Typemock Isolator来伪造HWSysManager。

对于你的榜样,你可以做到以下几点:

var fakeManager = Isolate.Fake.Instance<HWSysManager>(); 

Isolate.WhenCalled(() => fakeManager.OpenConfiguration("")).WillReturn(0); 

然后,你可以通过这个伪造经理ProcessBias(IHWSysManager systemManager, string hwPath)作为参数。

如上所述,您可以模拟IHWSysManager中的几种方法。所以,我的建议是成立的这个经理人的方法使用DoInstead()行为:

Isolate.WhenCalled(() => fakeManager.OpenConfiguration("")).DoInstead(
    context => 
    { 
     //Your simulation 
    }); 

你可以看看here以获取更多信息。我想,它对你来说可能非常有用。

相关问题