Использование IEnumerable для объединения двух макетированных объектов в XUnit - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь проверить логику при создании нового объекта. Или:

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

Моя установка такова:

// Non-core functionality
var functionality = new Mock<IFunctionality>();
functionality.Setup(x => x.Id).Returns(Guid.NewGuid());

// Entity with non-core functionality
var entity = new Mock<IEntity>();
entity.Setup(x => x.Functionalities).Returns(new List<IFunctionality>
{
    functionality.Object
});

// Core functionality
var coreFunctionality = new Mock<IFunctionality>();
coreFunctionality.Setup(x => x.Id).Returns(Guid.NewGuid());
coreFunctionality.Setup(x => x.IsCore).Returns(true);

// All functionalities
var functionalities = new List<IFunctionality>
{
    functionality.Object,
    coreFunctionality.Object
};

var functionalityManager = new Mock<IFunctionalityManager<IFunctionality>>();
functionalityManager.Setup(x => x.GetCoreFunctionalities()).Returns(new List<IFunctionality>
{
    coreFunctionality.Object
});

var service = new EntityService<IEntity>(functionalityManager.Object);

Тогда я звоню:

var create = service.Create(entity.Object);

Сервис реализует вышеуказанную логику следующим образом:

var coreFunctionalitites = _functionalityManager.GetCoreFunctionalities();
entity.Functionalities = entity.Functionalities != null
    ? entity.Functionalities.Union(coreFunctionalitites).ToList()
    : coreFunctionalitites.ToList();

Это работает, как и ожидалось на практике (т. Е. При публикации в API), но при проверке всегда выполняется следующее утверждение:

Assert.Equal(functionalities.Count, create.Functionalities.Count);

Когда я отлаживаю тест, в Immediate Window я вижу, что coreFunctionalities содержит coreFunctionality (с Guid):

coreFunctionalitites.First()
{Mock<IFunctionality:00000002>.Object}
    Id: {b0bbb77e-3e1a-415b-ac78-c36f1714ecf9}
    IsCore: true
    Mock (Castle.Proxies.IFunctionalityProxy): {Mock<IFunctionality:00000002>}
    Mock: {Mock<IFunctionality:00000002>}

Я также могу навести курсор на entity.Functionalities и увидеть, что он содержит functionality (с отдельным Guid):

{Mock<IFunctionality:00000001>.Object}
    Id: {3c4396d3-9667-418e-9287-da56c529cd90}
    IsCore: false
    Mock (Castle.Proxies.IFunctionalityProxy): {Mock<IFunctionality:00000001>}
    Mock: {Mock<IFunctionality:00000001>}

Но когда я пытаюсь entity.Functionalities.First() в Немедленном окне, я получаю:

error CS1061: 'T' does not contain a definition for 'Functionalities' and no extension method 'Functionalities' accepting a first argument of type 'T' could be found (are you missing a using directive or an assembly reference?)

После Union, coreFunctionality не было добавлено к entity.Functionalities. Я что-то упустил в настройке, чтобы заставить это работать?

UPDATE:

Я изменил соответствующий метод в службе, чтобы использовать определенный интерфейс IEntity (чтобы исключить переменную generics). С этим изменением теперь я могу успешно просматривать entity.Functionalities.First() в Немедленной Windows без ошибок. Но Union по-прежнему не работает.

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