簡體   English   中英

創建 Mock 的通用方法<interface>起訂量

[英]Generic method for creating Mock<interface> by Moq

我正在嘗試創建一些抽象類,該類將保留一些用於按 Moq 准備存根的常見操作。 我寫了一些東西,但我無法克服錯誤

public abstract class StubsCreatorAbstract
{
    public Mock<T> GenerateObject<T>() where T : IStub
    {
        var mock = new Mock<T>();
        return mock;
    }

    public Mock<D> SetupValue<T, D>(Mock<D> stub, string nameOfField, T value) where D : IStub
    {
        var field = typeof(D).GetProperty(nameOfField);
        if (field == null)
        {
            throw new ArgumentException("Field do not exist");
        }

        field.SetValue(stub.Object, value);
        return stub;
    }
 }

問題是: Mock 必須是引用類型。 我的問題是 - 有可能克服這個問題嗎? 提前致謝

更新:

那是編譯器錯誤。 關於 T 的問題 - 它說

"the type 'T' must be a reference type in order to use it as parameter 'T' in the generic type or method 'Mock<T>".

簡短的回答是:

public Mock<T> GenerateObject<T>() where T : IStub
{
    var mock = new Mock<T>();
    return mock;
}

不會工作。 相反,您應該使用:

new Mock<YourTypeHere>();

反而。

至於為什么你的原始代碼不起作用,我做了一些研究,但我不是 100% 確定為什么。

似乎您正在使用非引用類型作為通用約束。 我相信 IStub 是在您正在使用的具體類中實現的接口。 如果您指定如下約束,它將正常工作。

如果您想要更具體的約束,請讓您的類從基類繼承並在此處將其作為約束。

 public abstract class StubsCreatorAbstract
{
    public Mock<T> GenerateObject<T>() where T : class 
    {
        var mock = new Mock<T>();
        return mock;
    }

    public Mock<D> SetupValue<T, D>(Mock<D> stub, string nameOfField, T value) where D : class
    {
        var field = typeof(D).GetProperty(nameOfField);
        if (field == null)
        {
            throw new ArgumentException("Field do not exist");
        }

        field.SetValue(stub.Object, value);
        return stub;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM