2012-10-11 5 views

Antwort

4

begegnete ich die gleiche Situation beim Schreiben einige Unit-Tests. Die von James zur Verfügung gestellte Lösung funktionierte; es führte jedoch dazu, dass ein Codepfad für den Komponententest und ein anderer Pfad für den Produktionscode vorhanden war, der den Zweck des Komponententests vereitelte. Wir konnten einen zweiten Dokumentenspeicher erstellen und ihn mit dem ersten Dokumentenspeicher verbinden, der es uns ermöglichte, dann erfolgreich auf die Autorisierungs-Erweiterungs-Methoden zuzugreifen. Obwohl diese Lösung wahrscheinlich nicht für Produktionscode geeignet ist (da das Erstellen von Dokumentspeichern teuer ist), funktioniert sie gut für Komponententests. Hier ist ein Codebeispiel:

using (var documentStore = new EmbeddableDocumentStore 
     { RunInMemory = true, 
      UseEmbeddedHttpServer = true, 
      Configuration = {Port = EmbeddedModePort} }) 
{ 
    documentStore.Initialize(); 
    var url = documentStore.Configuration.ServerUrl; 

    using (var docStoreHttp = new DocumentStore {Url = url}) 
    { 
     docStoreHttp.Initialize(); 

     using (var session = docStoreHttp.OpenSession()) 
     { 
      // now you can run code like: 
      // session.GetAuthorizationFor(), 
      // session.SetAuthorizationFor(), 
      // session.Advanced.IsOperationAllowedOnDocument(), 
      // etc... 
     } 
    } 
} 

Es gibt einige andere Elemente, die erwähnt werden sollten:

  1. Das erste Dokument speichern muss mit dem UseEmbeddedHttpServer auf true gesetzt ausgeführt werden, so dass die zweite Dose darauf zuzugreifen.
  2. Ich habe eine Konstante für den Port erstellt, damit sie konsistent verwendet wird und die Verwendung eines nicht reservierten Ports gewährleistet.
3

Ich begegnete dies auch. Wenn man die Quelle betrachtet, gibt es keine Möglichkeit, diese Operation wie geschrieben auszuführen. Nicht sicher, ob es gibt einige innere Grund, warum ich da einfach die Funktionalität in meiner app, indem eine HTTP-Anfrage direkt für die gleichen Informationen replizieren konnte:

HttpClient http = new HttpClient(); 
http.BaseAddress = new Uri("http://localhost:8080"); 
var url = new StringBuilder("/authorization/IsAllowed/") 
    .Append(Uri.EscapeUriString(userid)) 
    .Append("?operation=") 
    .Append(Uri.EscapeUriString(operation) 
    .Append("&id=").Append(Uri.EscapeUriString(entityid)); 
http.GetStringAsync(url.ToString()).ContinueWith((response) => 
{ 
    var results = _session.Advanced.DocumentStore.Conventions.CreateSerializer() 
     .Deserialize<OperationAllowedResult[]>(
      new RavenJTokenReader(RavenJToken.Parse(response.Result))); 
}).Wait(); 
Verwandte Themen