Лучший способ дразнить Клиентский прокси WCF

Там какие-либо пути состоят в том, чтобы дразнить клиентский прокси WCF использование платформы насмешек Носорога, таким образом, у меня есть доступ к Свойству канала? Я пробую к Прокси модульного теста. Близко () метод, но поскольку прокси создается с помощью абстрактного базового класса ClientBase<T> который имеет ICommunicationObject интерфейс, мой модульный тест перестал работать, поскольку внутренняя инфраструктура класса отсутствует в фиктивном объекте. Любые хорошие пути с примерами кода значительно ценились бы.

10
задан abatishchev 27 March 2012 в 13:52
поделиться

1 ответ

Что вы можете сделать, так это создать интерфейс, который наследуется от оригинального интерфейса сервиса и ICommunicationObject. Затем вы можете привязаться к этому интерфейсу и высмеять его, сохранив все важные методы.

For example:

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();
21
ответ дан 3 December 2019 в 18:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: