Можете ли вы объяснить, что делает Moq здесь, в очень простых терминах? - PullRequest
2 голосов
/ 16 марта 2011

Вот мой IProductRepository:

public interface IProductsRepository
{
    IQueryable<Product> Products { get; }
}

А вот где я использую Moq:

public static IProductsRepository MockProductsRepository(params Product[] prods)
{
    var mockProductRepos = new Mock<IProductsRepository>();
    mockProductRepos.Setup(x => x.Products).Returns(prods.AsQueryable());
    return mockProductRepos.Object;
}

А вот как я использую этот метод MockProductsRepository:

[Test]
public void Product_Lists_Include_Correct_Page_Numbers()
{
    //Arrange: If there are five products in the repository...
    var mockRepository = UnitTestHelpers.MockProductsRepository(
        new Product { Name = "P1" }, new Product { Name = "P2" },
        new Product { Name = "P3" }, new Product { Name = "P4" },
        new Product { Name = "P5" }
    );

    var controller = new ProductsController(mockRepository) { PageSize = 3 };

    //yada yada yada...
}

Что именно делает Moq?Я слежу за книгой Pro ASP.Net MVC2, и она преподает мне все виды нового волшебства, и прежде чем я продолжу читать, я хотел бы понять, что происходит - и сейчас я просто знаю, что «это не работает» ничегоБольше.:)

Спасибо, что уделили время.

Ответы [ 3 ]

4 голосов
/ 16 марта 2011

Moq генерирует IL в памяти для класса, который реализует IProductsRepository, со всеми его свойствами / методами, вызывающими Moq, чтобы посмотреть, что он должен делать.Setup настраивает свойство Products, чтобы оно всегда возвращало предоставленный список продуктов (как IQueryable) при его вызове.Затем он возвращает сгенерированный объект как IProductsRepository, который затем может быть передан в ProductsController, что не имеет смысла в его динамической природе.

1 голос
/ 16 марта 2011

Фальшивые фреймворки (а также некоторые другие DI-фреймворки) могут генерировать во время выполнения (обычно используя Reflection.Emit), реализацию интерфейса, который они обычно называют proxy (хотя у этого термина есть много запутанных изменений в значении).

В случае имитации это будет перехватывать вызовы к этому интерфейсу и иметь реализацию для проверки ожиданий, которые вы на них устанавливаете.

0 голосов
/ 16 марта 2011

За кулисами Moq динамически создает реализацию вашего интерфейса IProductRepository и заставляет метод Products возвращать IQueryable<Product>, который вы дали в методе Returns.

Яне знаю точно, точно , как это работает, но я думаю, что он создает делегат для функции, которую вы вызвали Setup, для которой возвращается значение, данное Returns.

Таким образом, ваш тестовый код возвращает класс, который реализует интерфейс IProductRepository, но это динамически созданный класс, для которого было перенаправлено некоторое поведение для выполнения определенных вами заданий.Затем Moq может проверить, что указанные действия были выполнены, чтобы подтвердить ваши ожидания, или просто вернуть данные, если вы заинтересованы только в предоставлении ложных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...