出于测试的目的,我们想模拟OperationContext类。我们正在使用'Mock‘。但是OperationContext是一个密封的类,不能被模仿。因此,我们尝试创建一个虚拟的OperationContext对象。但是OperationContext构造函数使用IContextChannel作为参数。我们想知道一种获取IContextChannel的方法,这样它就可以被传递给OperationContext构造函数。
发布于 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
#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的代理。
发布于 2011-07-13 07:44:53
NetFX project包含许多包装器类和接口,以允许进行此类操作。
https://stackoverflow.com/questions/5016386
复制相似问题