簡體   English   中英

使用Moq模擬擴展IList的接口

[英]Using Moq to mock an interface that extends IList

我正在嘗試模擬擴展IList的接口,並使該模擬作為IEnumerable工作。 我期望模擬對象包含一個可枚舉的用戶列表,但該枚舉不會產生任何結果。 如果我將接口ITestEnumerable擴展為IEnumerable而不是IList,則下面的代碼有效。

public interface ITestEnumerable : IList<User>
{

}

[Fact]
public void TestTest()
{
    //Arrange
    var fakes = new List<User>()
    {
        new User() { DisplayName = "Joe Smith", Mail = "jsmith@test.com" },
        new User() { DisplayName = "Jane Doe", Mail = "jdoe@test.com" }
    };
    var mockTest = new Mock<ITestEnumerable>();
    mockTest.Setup(t => t.Count).Returns(() => fakes.Count());
    mockTest.Setup(t => t[It.IsAny<int>()]).Returns<int>(i => fakes.ElementAt(i));
    mockTest.As<IEnumerable<User>>().Setup(t => t.GetEnumerator()).Returns(() => fakes.GetEnumerator());
    var testList = new List<User>();

    //Act
    testList.AddRange(mockTest.Object);

    //Assert
    Assert.NotNull(testList[0]);
}

這里的問題出在AddRange函數的內部: https ://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs,79de3e39e69a4811

您可以看到,第一個嘗試是將其強制轉換為ICollection,然后有一個完整的CopyTo流。

因此,最簡單的方法是將其替換為類似的內容。 無論如何,您都可以進行模擬枚舉。 也可以使用LINQ縮短它。

foreach(var item in mockTest.Object)
{
    testList.Add(item);
}

如果要使用最小起訂量執行此操作,則應適合以下情況:

mockTest.As<ICollection<User>>().Setup(t => t.CopyTo(It.IsAny<User[]>(), It.IsAny<int>())).Callback<User[], int>((u,c) => fakes.CopyTo(u,c));

暫無
暫無

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

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