2014-09-26 127 views
2

我正在通過NUnit將一些舊式WCF服務的現有集成測試轉換爲自動化。當前的測試調用WCF服務的部署版本;我想要做的是讓測試直接/內部地打到服務類(MyService.svc.cs)。測試使用假冒的WCF服務

我遇到的問題是,該服務使用模擬:

//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總是空,當我把它從一個單元測試。

模擬在下游操作中很重要,所以我不能繞過這段代碼,只是調用using塊內的內容。可能將我的測試代碼打包爲WindowsIdentity.GetCurrent().Impersonate(),然後調用using塊中的內容(繞過MyService.svc.cs代碼),但這樣做可能不太理想,因爲它不是完整的端到端結束測試。

我不需要冒用不同的用戶來模仿 - 我只需要運行者的用戶上下文在ServiceSecurityContext.Current中可用。

這可能嗎?

回答

1

我仍然有興趣做一個更好,侵略性較小的方法,但這似乎現在工作。

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