正在测试使用模拟的WCF服务
本文关键字:WCF 服务 模拟 测试 | 更新日期: 2023-09-27 18:24:51
我正在转换一些现有的遗留WCF服务集成测试,以便通过NUnit实现自动化。当前测试调用WCF服务的已部署版本;我想做的是让测试直接/内部地访问服务类(MyService.svc.cs)。
我遇到的问题是该服务使用模拟:
//this is a method in MyService.svc.cs
public SomeObject GetSomeObject()
{
using (GetWindowsIdentity().Impersonate())
{
//do some stuff
}
return null;
}
private WindowsIdentity GetWindowsIdentity()
{
var callerWinIdentity = ServiceSecurityContext.Current.WindowsIdentity;
var cf = new ChannelFactory<IMyService>();
cf.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
return callerWinIdentity;
}
问题是,当我从单元测试中调用ServiceSecurityContext.Current时,它总是为null。
模拟在下游操作中很重要,所以我不能绕过这段代码,只调用using
块中的内容。也许可以将我的测试代码封装在WindowsIdentity.GetCurrent().Impersonate()
和中,然后调用using
块中的内容(绕过MyService.svc.cs代码),但这并不理想,因为这不是一个完整的端到端测试。
我不需要伪造不同的用户来模拟——我只需要运行者的用户上下文在ServiceSecurityContext.Current.中可用
这可能吗?
我仍然对一种更好、侵入性更小的方法感兴趣,但这似乎目前有效。
我为MyService创建了第二个构造函数,以允许使用WindowsIdentity.GetCurrent()
。
private readonly bool _useLocalIdentity;
public MyService(bool useLocalIdentity) :this()
{
_useLocalIdentity = useLocalIdentity;
}
private WindowsIdentity GetWindowsIdentity()
{
if (_useLocalIdentity)
{
return WindowsIdentity.GetCurrent();
}
var callerWinIdentity = ServiceSecurityContext.Current.WindowsIdentity;
if (callerWinIdentity == null)
{
throw new InvalidOperationException("Caller not authenticated");
}
var cf = new ChannelFactory<IMyService>();
cf.Credentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
return callerWinIdentity;
}