我们希望对执行命名查询的一些服务器端组件执行单元测试,这些组件构造函数接收EntityManager。
我们的单元测试框架基于NUnit,我们以非分布式模式运行测试以模拟2层部署。不幸的是,从单元测试代码创建一个EntityManager将始终产生一个"客户端"经理,虽然我们需要一个" Server"版本(即与服务器方法中获得的版本相同)。当我们获得客户端版本时,由于模型的安全性限制,我们正在测试的代码中的一些命名查询被拒绝。
有没有一种很好的方法来检索EntityManager并以某种方式模拟单元测试端的服务器行为?到目前为止,我遇到的最好的方法是调用一个专用的服务器方法,将EntityServer存储在全局变量的某个地方,并使用单元测试中的方法。
此致
答案 0 :(得分:2)
正如您所发现的,DF并不是特别适合单元测试,而您使用的方法是一种很好的解决方法。
DevForce"服务器端"无论实际部署如何,都将始终调用(如果找到)IEntityLoginManager,EntityServerQueryInterceptors等组件。所以即使在运行2层单元测试时也是如此 DF将启动内存中的EntityServer并查找服务器端组件,以满足EntityManager的请求。
如果您遇到ClientCanQuery授权检查问题,这意味着默认的EntityServerQueryInterceptor授权逻辑正在进行中。您可以使用"组合上下文"来实现自定义拦截器以进行测试。 DevForce的功能。使用自定义测试拦截器,您可以覆盖默认授权逻辑以允许运行这些查询。有关使用合成上下文和测试here的一些信息。
或者,如果你想扩展" unit"的含义。测试,因为无论如何都会调用服务器端组件,您可以编写简单的客户端单元测试,触发您要测试的特定服务器端逻辑。 例如,在客户端上调用的简单命名查询将导致命名查询提供程序和/或查询拦截器中的特定逻辑运行,并且测试可以验证结果。