簡體   English   中英

如何使用Moq存根接口方法

[英]How can I stub an interface method using Moq

有沒有一種方法可以使用Moq存根方法? 我看到了很多標題相似的問題,但沒有一個能真正回答我的問題。 這是給我的一個單元測試示例,我發現使用Moq進行測試非常困難。 我想做的是對EmailTask​​s.UserIsValidForNotice()方法進行單元測試:

public class User
{

    public DateTime JoinDate { get; set; }
    public bool Active { get; set; }
}

public class EmailTasks
{
    IUserRepository repo;
    public EmailTasks(IUserRepository repo)
    {
        this.repo = repo;
    }
    public IList<User> UserIsValidForNotice(DateTime minDate)
    {
        return repo.FindAll(u => u.Active && u.JoinDate > minDate);
    }
}

public interface IUserRepository
{
    IList<User> FindAll(Func<User, bool> q);
}

我可以像下面那樣建立一個存根,然后輕松地測試查詢,但是由於無法訪問Mocks Return函數中的方法參數,因此無法使用Moq進行查詢。

public class StubRepo : IUserRepository
{
    public IList<User> PersonList { get; set; }

    public IList<User> FindAll(Func<User, bool> q)
    {
        return PersonList.Where(q).ToList();
    }
}

我知道這可能不是最好的設計,但是我只是想知道是否可以使用Moq完成。

這里的問題是您要測試什么?

IMO,您應該測試的是您是否使用正確的Func調用了存儲庫。 您可以按照以下步驟進行操作:

[Test]
public void UserIsValidForNotice_has_correct_expression()
{
    var repoMock = new Mock<IUserRepository>();

    var sut = new EmailTasks(repoMock.Object);
    sut.UserIsValidForNotice(DateTime.Now);

    repoMock.Verify(r => r.FindAll(It.Is<Func<User, bool>>(func => func(someUser));
}

當調用Verify方法時,您檢查是否已調用存儲庫。 此外,您檢查是否已使用Func<User, bool>的實例(即It.Is<>部分) It.Is<>它。

對於It.Is<>您可以指定一個回調函數,該回調函數將獲取傳遞的參數,並在參數有效時返回true,否則返回false。 因此,在該回調中,您可以對已知用戶執行Func並檢查其評估是否正確。

如果您仍然想將其存根並返回某些內容,則可以這樣做:

repoMock.Setup(r => r.FindAll(It.IsAny<Func<User, bool>>)
        .Returns<Func<User, bool>, IList<User>>(fnc => new List<User>());

如果調用Returns的泛型重載,則最多可以指定8個類型參數。 第一個將被傳遞到您提供的表達式中(從實際調用中),而最后一個將確定返回類型。

var personList = new List<User>(); // set up your personList here
var repoMock = new Mock<IUserRepository>();
repoMock.Setup(repo => repo.Findall(It.IsAny<Func<User, bool>>())
    .Return((Func<user, bool> q) => personList.Where(q).ToList());

暫無
暫無

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

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