WCF数据服务:模拟OperationContext

WCF数据服务:模拟OperationContext

问题描述:

我们想模拟OperationContext类用于测试目的。我们正在使用'模拟'。但OperationContext是一个密封的类,不能被嘲笑。因此我们正试图创建一个虚拟OperationContext对象。但OperationContext构造函数需要IContextChannel作为参数。我们想知道一种方法来获得IContextChannel,以便它可以传递给OperationContext构造函数。WCF数据服务:模拟OperationContext

NetFX project包含许多包装类和接口来允许这样的事情。

+0

你能提供包装类的名字吗?我在链接中看不到文档。 – 2013-07-11 11:57:47

一般建议是implement wcf services without referencing wcf

例子如何做到这一点是http://marcin.floryan.pl/blog/2012/01/do-we-really-need-wcfmock

我们替换到 operationResponse基准的基准来的OperationContext。 operationResponse应该定义为一个 接口,并且可以在构造函数中注入,就像给出的示例中的 存储库一样。我们的测试方法现在变为 稍短且更具可读性。

而且在http://blogs.msdn.com/b/ploeh/archive/2006/12/04/integrationtestingwcfservices.aspx

让我们,一会儿,考虑到执行授权的必要性。您可以直接在您的每个 操作实施中检查OperationContext.Current,但这会混合考虑(业务 逻辑中执行的操作与授权混合在一起)。 正确的方法是提供从 ServiceAuthorizationManager派生的类,并将服务配置为使用此类 类进行授权。这可以让你保持你的操作实现的单元测试 ,但很明显,你还需要测试 授权管理器本身,事实证明,集成测试是完成这项任务的最简单方法。

如果您仍需要模拟遵循建议从http://blogs.msdn.com/b/ploeh/archive/2008/06/28/unit-testing-duplex-wcf-services.aspx

所有你需要做的是用抽象的东西来代替电话 toOperationContext.GetCallbackChannel。在.NET 3.5上,最简单的抽象是Func,它具有相同的 签名,但如果您使用.NET 3.0,则始终可以定义类似的 您自己的委托类型。

或者作为最后手段可以使用WCFmock

#if DEBUG 
    using WebOperationContext = System.ServiceModel.Web.MockedWebOperationContext; 
#endif 

例如,这是有用的,如果你想在 开发使用嘲笑版本,始终WCF版生产。这一切,你 不需要触摸你现有的服务实现可言,一旦 你定义的别名,该服务已准备好进行测试

http://blog.gfader.com/2010/08/how-to-unit-test-wcf-service.html

所有调用的OperationContext .Current.Channel.SessionId得到 被MockedOperationContext拦截,但是只有在你的测试中,你是 嘲讽OperationContext。在您正常的环境中,MockedOperationContext充当真实OperationContext的代理。