Click here to Skip to main content
15,881,172 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
While doing unit testing, i am not able to get collection back from dbset after add new entity in dbset, it throw an exception 'Collection was modified'

Here is my code setup
C#
[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);
}

?

What I have tried:

here I'm not able to understand what I do wrong in this case. for reference I'm using this link:
Entity Framework 6 and Moq4: Is it possible to have a mocked DbSet retain added data for the duration of its scope?
Posted
Updated 29-Nov-16 1:10am
v3

1 solution

The error occurred in moq Dbset because I m not updating the reference of GetEnumerator after adding new Entity in DB set.

Code :

C#
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>
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900