正在测试使用模拟的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.中可用

这可能吗?

正在测试使用模拟的WCF服务

我仍然对一种更好、侵入性更小的方法感兴趣,但这似乎目前有效。

我为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;
    }