2010-03-24 11 views
10

¿Hay alguna forma de burlarse de un proxy de cliente WCF utilizando el framework de simulaciones de Rhino para que tenga acceso a la propiedad Channel? Estoy intentando probar el método Proxy.Close() pero como el proxy se construye utilizando la clase base abstracta ClientBase<T> que tiene la interfaz ICommunicationObject, la prueba de mi unidad está fallando ya que la infraestructura interna de la clase está ausente en el objeto simulado. Cualquier buena forma con muestras de código sería muy apreciada.La mejor forma de burlarse del proxy WCF Cliente

+0

Ver un artículo [hosting-maqueta-como-servicio WCF] (http://bronumski.blogspot.com.au/2011/09/hosting-mock-as- wcf-service.html) y la respuesta relacionada http://stackoverflow.com/a/10306934/52277 –

Respuesta

20

Lo que podría hacer es crear una interfaz que herede de la interfaz de servicio original y ICommunicationObject. A continuación, podría vincularse y burlarse de esa interfaz y seguir teniendo todos los métodos importantes.

Por ejemplo:

public interface IMyProxy : IMyService, ICommunicationObject 
{ 
    // Note that IMyProxy doesn't implement IDisposable. This is because 
    // you should almost never actually put a proxy in a using block, 
    // since there are many cases where the proxy can throw in the Dispose() 
    // method, which could swallow exceptions if Dispose() is called in the 
    // context of an exception bubbling up. 
    // This is a general "bug" in WCF that drives me crazy sometimes. 
} 

public class MyProxy : ClientBase<IMyService>, IMyProxy 
{ 
    // proxy code 

} 

public class MyProxyFactory 
{ 
    public virtual IMyProxy CreateProxy() 
    { 
     // build a proxy, return it cast as an IMyProxy. 
     // I'm ignoring all of ClientBase's constructors here 
     // to demonstrate how you should return the proxy 
     // after it's created. Your code here will vary according 
     // to your software structure and needs. 

     // also note that CreateProxy() is virtual. This is so that 
     // MyProxyFactory can be mocked and the mock can override 
     // CreateProxy. Alternatively, extract an IMyProxyFactory 
     // interface and mock that. 
     return new MyProxy(); 
    } 
} 

public class MyClass 
{ 
    public MyProxyFactory ProxyFactory {get;set;} 
    public void CallProxy() 
    { 
     IMyProxy proxy = ProxyFactory.CreateProxy(); 
     proxy.MyServiceCall(); 
     proxy.Close(); 
    } 
} 


// in your tests; been a while since I used Rhino 
// (I use moq now) but IIRC...: 
var mocks = new MockRepository(); 
var proxyMock = mocks.DynamicMock<IMyProxy>(); 
var factoryMock = mocks.DynamicMock<MyProxyFactory>(); 
Expect.Call(factoryMock.CreateProxy).Return(proxyMock.Instance); 
Expect.Call(proxyMock.MyServiceCall()); 
mocks.ReplayAll(); 

var testClass = new MyClass(); 
testClass.ProxyFactory = factoryMock.Instance; 
testClass.CallProxy(); 

mocks.VerifyAll(); 
Cuestiones relacionadas