2012-03-27 68 views
0

我有一个使用里面的代理类来调用提供数据的服务的类。当然如果这个方法在里面创建代理,那么测试这个类是有问题的。你认为代理应该在构造函数中给出,即使它可以在没有“知道”的情况下创建吗?构建一个可以测试的类

回答

1

您应该通过依赖注入(构造函数,属性,参数)向类提供类依赖关系。这使得你的类可测试,并允许模拟所有这些依赖关系。

UPDATE: 进样服务代理:

class Foo 
{ 
    private IServiceProxy _serviceProxy; 
    public Foo(IServiceProxy _serviceProxy) 
    { 
     _serviceProxy = serviceProxy; 
    } 

    public void Bar() 
    { 
     var staff = _serviceProxy.GetStaff(); 
    } 
} 

顺便说一句考虑隐瞒从你的类代理信息。例如。通过代理实现与实际服务相同的接口并为您的课程提供IService。

UPDATE2(网关):

我们所有的域名需要 - 获得一些工作人员。所以,我们定义接口:

interface IStaffService 
{ 
    Staff GetStaff(); 
} 

我们的领域类(您的测试类只使用这个接口,并且不依赖于Web服务,代理创作和其他基础设施问题)。

下一页为您服务创建网关(见Martin Fowler的网站定义):

public MyServiceProxyGateway : IStaffService 
{ 
    public Staff GetStaff() 
    { 
     var proxy = new YourProxyType(); 
     proxy.X = value; 
     proxy.Y = value; 
     var response = proxy.CallActualServiceMethod(); 
     Staff staff = new Staff(); 
     staff.Value = response.Something; 
     return staff; 
    } 
} 

现在您的代码完全不知道这一切的基础设施的通信。你使用方便的接口GetStaff而不是CallActualServiceMethod。

+0

逻辑,但你说如果一个类使用某种代理它可靠,所以它应该被注入? – guyl 2012-03-27 08:38:20

+0

当然,你的测试中不应该有任何真实的代码(除了测试对象)。因为当测试失败时,您将无法分辨出您的班级故障或者服务代理中的某些内容。当然,考虑环境问题 - 处理网络和数据库不是你想测试的东西:)如果你想测试代理,写它的集成测试。 – 2012-03-27 08:46:13

+0

请解释“Btw考虑隐藏你的类的代理信息的含义,例如通过代理实现相同的接口来实现实际服务,并为你的类提供IService。”我无法理解 – guyl 2012-03-27 08:52:11

1

那么,“代理类知道如何实例化自己”和“类知道如何实例化代理类”之间有区别。第二,如果你把这些知识包装在内部,单元测试就会变得更加困难(如果不是不可能的话)。我想使用依赖注入(通过框架,构造函数或属性)将这些知识传递给调用者 - 并使其成为可测试的。

1

为了测试我的代理类,我通常给出了应该在构造函数中被代理的目标。可以给我一个存根对象进行测试的可能性。

public class MyProxy : IProxiedInterface 
{ 
    private IProxiedInterface _Target; 

    public MyProxy(IProxiedInterface target) 
    { 
     if(target == null) 
      throw new ArgumentNullException("target"); 

     _Target = target; 
    } 

    // ToDo: Implement all functions from IProxiedInterface 
    //  and delegate them to the target 
    public bool DoSomething() 
    { 
     return _Target.DoSomething(); 
    } 
} 
相关问题