Я пытаюсь проверить логику при создании нового объекта. Или:
- сущность входит без связанных функциональных возможностей (в этом случае она получает все существующие основные функциональные возможности), или
- сущность входит с некоторыми связанными функциональными возможностями (в этом случае она получает эти функциональные возможности ∪ все существующие основные функциональные возможности).
Моя установка такова:
// 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
по-прежнему не работает.