如何模拟泛型方法返回具体类型?

时间:2017-12-09 15:19:19

标签: c# .net unit-testing generics mocking

我试图模拟泛型方法的返回类型以匹配特定的具体类型,但我似乎无法让这个转换成功:

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@email.com"
        };
    }

所以我的问题是如何让mock方法返回GenericIsAuthenticatedResponse?

2 个答案:

答案 0 :(得分:1)

由于泛型如何工作,这不起作用。如果要返回特定类型,则需要为T提供过滤器:

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

否则,请勿将泛型用于返回类型:

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

    return default(T);
}

如果你完全确定T将是GenericIsAuthenticatedResponse(鉴于它是测试),你可以这样做:

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

    return default(T);
}

答案 1 :(得分:-2)

我最后应用了一些横向思维(或者根据你的POV提出的bodge)和序列化/反序列化的Json来实现这个目标:

   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);
    }