如何在具体对象是依赖项时告诉PEX使用模拟对象,然后自动生成测试用例?

时间:2012-01-05 17:53:44

标签: unit-testing mocking pex

我在提供的框架中编写客户端组件,并且需要能够对我的组件进行单元测试。组件是使用MVP(Model-View-Presenter)模式编写的,我想使用PEX为我的演示者自动生成单元测试。

以下是演示者的代码。

public partial class CompetitorPresenter : PresenterBase
{

    private readonly ICompetitorView _view; 

    public IGlobalDataAccess GlobalDataAccess;

    public IGlobalUI Globals;

    public SystemClient Client;

    public bool DeleteRecord()
   {
           if (_view.CompetitorName != "Daniel")
                return false;
           if (Client.SystemName != "Ruby")
                return false;
           return true;
    }
}

我遇到的问题是框架提供了对象SystemClient,我不能使用工厂类来创建SystemClient的实例。因此,当我运行PEX以自动生成单元测试时,我必须告诉PEX忽略SystemClient,结果是方法DeleteRecord没有完全覆盖,因为行Client.SystemName != "Ruby"是未经测试。

由于我有模拟对象MSystemClient(使用moles创建),我想知道配置中的某个地方我是否可以告诉PEX使用MSystemClient,并让PEX自动生成测试用例涵盖这种方法。

1 个答案:

答案 0 :(得分:0)

你走在正确的轨道上。如果您无法控制创建CompetitorPresenter.Client实例的位置,则可以为所有实例定义一个mole:

MSystemClient.AllInstances.SystemNameGet = () => "SomeName";

您的单元测试必须在“托管环境”中运行:

[HostType("Moles")]
public void TestMethod()
{
  MSystemClient.AllInstances.SystemNameGet = () => "SomeName";

  // Test code...
}