2017-12-09 3 views
0

Ich versuche, den Rückgabetyp einer generischen Methode zu verspotten einen bestimmten konkreten Typen übereinstimmen, aber ich kann nicht das Casting zu bekommen scheinen zu funktionieren:Wie man eine generische Methode vortäuscht, um konkreten Typ zurückzugeben?

enter image description here

public T Get<T>(string key) 
    { 
     if (typeof(T) == typeof(GenericIsAuthenticatedResponse) && key == "1234") 
      return GetGenericIsAuthenticatedResponse(); 

     return default(T); 
    } 

    private static GenericIsAuthenticatedResponse GetGenericIsAuthenticatedResponse() 
    { 
     return new GenericIsAuthenticatedResponse 
     { 
      AuthCode = "1234", 
      Email = "[email protected]" 
     }; 
    } 

Also meine Frage ist, wie kann ich die Mock-Methode erhalten, um GenericIsAuthenticatedResponse zurückzugeben?

+0

Warum möchten Sie Ihre Methode in diesem Fall generisch sein? –

+0

Da es für verschiedene Typen verwendet wird, teste ich nur ein sehr spezifisches Szenario. – Simon

+1

Unter der Annahme, dass T im Test immer 'GenericIsAuthenticatedResponse' ist, können Sie den Rückgabewert einfach in' T' umwandeln, bevor Sie ihn zurückgeben. –

Antwort

1

Das funktioniert nicht, weil Generika funktionieren. Wenn Sie einen bestimmten Typ zurückgeben möchten, müssen Sie einen Filter schaffen für T:

public T Get<T>(string key) where T: GenericIsAuthenticatedResponse 

Ansonsten keine Generika verwenden für den Rückgabetyp:

public object Get<T>(string key) 
{ 
    if (typeof(T) == typeof(GenericIsAuthenticatedResponse) && key == "1234") 
     return GetGenericIsAuthenticatedResponse(); 

    return default(T); 
} 

Wenn Sie ganz sicher sind, dass T wird GenericIsAuthenticatedResponse (da es ist ein Test), können Sie dies tun:

public T Get<T>(string key) 
{ 
    if (typeof(T) == typeof(GenericIsAuthenticatedResponse) && key == "1234") 
     return (T)GetGenericIsAuthenticatedResponse(); 

    return default(T); 
} 
+0

Ja danke, aber ich möchte die Methode nicht ändern, nur um 1 spezifischen Testfall zu erfüllen. – Simon

+0

@Simon Ich habe die Antwort bearbeitet, um das widerzuspiegeln –

-2

ich einige Querdenker am Ende aufgebracht (oder bodge je o n Ihre POV) und serialisierte/deserialisierte Json, um dies zu erreichen:

public T Get<T>(string key) 
    { 
     if (typeof(T) == typeof(GenericIsAuthenticatedResponse) && key == "1234") 
      return JsonConvert.DeserializeObject<T>(GetGenericIsAuthenticatedResponse()); 

     return default(T); 
    } 

    private static string GetGenericIsAuthenticatedResponse() 
    { 
     var r = new GenericIsAuthenticatedResponse 
     { 
      Username = "email.email.com", 
      AuthCode = "1234" 
     }; 

     return JsonConvert.SerializeObject(r); 
    } 
+1

Dies wird fehlschlagen, wenn 'T' ist alles andere als eine' GenericIsAuthenticatedResponse'. Wenn dies der Fall wäre, hätten Sie einfach '(T) GetGenericIsAuthenticatedResponse()' –

+0

Sie können ein Objekt nicht serialisieren und deserialisieren, nur um eine Referenz zu erzeugen. –

Verwandte Themen