Ankit Rana Ответов: 1

Коллекция была изменена, операция перечисления не может быть выполнена в moq с EF


Во время модульного тестирования я не могу получить коллекцию обратно из dbset после добавления новой сущности в dbset, она выдает исключение "коллекция была изменена".

Вот моя настройка кода
[TestMethod]
[TestCategory("Skill Category")]
public void Create_Skill_Category()
{
    var category = new SkillCategoryModel() { CategoryId = 3, CategoryName = "Category 3" };
    var result = skillManager.SaveSkillCategory(category);
    Assert.IsNotNull(result, "Category can't be null");
    Assert.AreEqual(category.CategoryId, result.CategoryId, "Category id must be equal");
    var categoryList = skillManager.GetCategories(); // here exception thrown
    Assert.IsTrue(categoryList.Count == 3, "Categories List must be contain three category");
}


private ISkill skillManager;
[TestInitialize]
public void Init()
{
    var category = new SkillCategory { CategoryId = 1, CategoryName = "Category 1" };

    var categories = new List<skillcategory>
    { 
        category,
        new SkillCategory { CategoryId = 2, CategoryName = "Category 2" }
    };
    var categoryMockSet = Utility.GenerateMockEntity(categories);
    categoryMockSet.Setup(x => x.Add(It.IsAny<skillcategory>())).Callback<skillcategory>(x => categories.Add(x)).Returns<skillcategory>(x => x);
    var mock = new Mock<whoentities>();
    mock.Setup(q => q.SkillCategories).Returns(categoryMockSet.Object);
    mock.CallBase = true;
    skillManager = new WhoGroup.DML.Managers.SkillManager(mock.Object);
}

?

Что я уже пробовал:

здесь я не могу понять, что я делаю не так в этом случае. для справки я использую эту ссылку:
Entity Framework 6 и Moq4: возможно ли, чтобы издевательский DbSet сохранял добавленные данные в течение всего срока его действия?

1 Ответов

Рейтинг:
8

Ankit Rana

Ошибка произошла в moq Dbset, потому что я не обновляю ссылку GetEnumerator после добавления новой сущности в набор БД.

Код :

public class Utility
    {
        public static Mock<dbset<tentity>> GenerateMockEntity<tentity>(List<tentity> entityList) where TEntity : class
        {
            var list = new List<tentity>();
            list.AddRange(entityList);
            var query = list.AsQueryable();
            var entityMockSet = new Mock<dbset<tentity>>() { CallBase = true};
            entityMockSet.As<iqueryable<tentity>>().Setup(m => m.Provider).Returns(query.Provider);
            entityMockSet.As<iqueryable<tentity>>().Setup(m => m.Expression).Returns(query.Expression);
            entityMockSet.As<iqueryable<tentity>>().Setup(m => m.ElementType).Returns(query.ElementType);
            entityMockSet.As<ienumerable<tentity>>().Setup(m => m.GetEnumerator()).Returns(query.GetEnumerator());
            entityMockSet.Setup(x => x.Add(It.IsAny<tentity>())).Callback<tentity>(x => {
                list.Add(x);
                entityMockSet.As<ienumerable<tentity>>().Setup(m => m.GetEnumerator()).Returns(list.GetEnumerator());
            }).Returns<tentity>(x => x);
            return entityMockSet;
        }
    }</tentity></ienumerable<tentity></tentity></tentity></ienumerable<tentity></iqueryable<tentity></iqueryable<tentity></iqueryable<tentity></dbset<tentity></tentity></tentity></tentity></dbset<tentity>