Czy istnieją sposoby na pozorowanie proxy klienta WCF przy użyciu środowiska mola Rhino, więc mam dostęp do właściwości kanału? Próbuję przetestować metodę Proxy.Close(), ale ponieważ proxy jest konstruowane przy użyciu abstrakcyjnej klasy bazowej ClientBase<T>
, która ma interfejs ICommunicationObject
, mój test jednostki kończy się niepowodzeniem, ponieważ wewnętrzna infrastruktura klasy jest nieobecna w symulowanym obiekcie. Wszelkie dobre sposoby z próbkami kodu będą bardzo mile widziane.Najlepszy sposób na makiety proxy klienta WCF
10
A
Odpowiedz
20
Co można zrobić, to utworzyć interfejs dziedziczący z oryginalnego interfejsu usługi i ICommunicationObject
. Można wtedy wiązać i kpić z tego interfejsu i nadal mieć wszystkie ważne metody.
Na przykład:
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();
Zobacz artykuł [gospodarzem-mock-as-WCF usługi] (http://bronumski.blogspot.com.au/2011/09/hosting-mock-as- wcf-service.html) i pokrewną odpowiedź http://stackoverflow.com/a/10306934/52277 –