首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF数据服务:模拟OperationContext

WCF数据服务:模拟OperationContext
EN

Stack Overflow用户
提问于 2011-02-16 20:25:14
回答 2查看 4.9K关注 0票数 6

出于测试的目的,我们想模拟OperationContext类。我们正在使用'Mock‘。但是OperationContext是一个密封的类,不能被模仿。因此,我们尝试创建一个虚拟的OperationContext对象。但是OperationContext构造函数使用IContextChannel作为参数。我们想知道一种获取IContextChannel的方法,这样它就可以被传递给OperationContext构造函数。

EN

回答 2

Stack Overflow用户

发布于 2013-07-12 20:09:19

一般推荐使用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 with这个抽象的调用。在Func 3.5上,最简单的抽象是.NET,它具有相同的签名,但是如果你在.NET 3.0上,你总是可以定义你自己的类似的委托类型。

或者,作为最后一种选择,您可以使用WCFmock

代码语言:javascript
复制
#if DEBUG
     using WebOperationContext = System.ServiceModel.Web.MockedWebOperationContext;
#endif

例如,如果您想在开发中使用模拟版本,而在生产中始终使用

版本,则此功能非常有用。仅此而已,您根本不需要接触现有的服务实现,一旦定义了别名,就可以对服务进行测试了

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

您对OperationContext.Current.Channel.SessionId的所有调用都会被MockedOperationContext拦截,但只有在您的测试中,您才会模拟OperationContext。在您正常环境中,MockedOperationContext充当实际OperationContext的代理。

票数 3
EN

Stack Overflow用户

发布于 2011-07-13 07:44:53

NetFX project包含许多包装器类和接口,以允许进行此类操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5016386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档