存储库上的Unittest saveorupdate-method

时间:2016-01-25 08:38:01

标签: c# unit-testing moq mstest

我正在编写单元测试。我正在使用Moq和Microsoft.VisualStudio.TestTools.UnitTesting。

我已经准备好以下工作了:

 Mock<PersonRepository> _persoonRepository;
    IEnumerable<Domain.Person> _personen;

    [TestInitialize()]
    public void Initialize()
    {
        // *Arrange*
        var mockSet = new Mock<DbSet<Domain.Person>>();
        var mockContext = new Mock<DatabaseContext>();
        mockContext.Setup(m => m.Persons).Returns(mockSet.Object);
        _persoonRepository = new Moq.Mock<PersonRepository>(mockContext.Object);
        _personen = new List<Domain.Person>() { new Domain.Person { ID = 1, Name = "Bart Schelkens", GewerkteDagen = 200, Leeftijd = 52, Type = "1" },
                                        new Domain.Person { ID = 2, Name = "Yoram Kerckhofs", GewerkteDagen = 190, Leeftijd = 52, Type = "1" }};

        _persoonRepository.Setup(x => x.GetAll()).Returns(_personen);

    [TestMethod()]
    public void GetAllShouldReturnResult()
    {
        var result = _persoonRepository.Object.GetAll();
        Assert.IsNotNull(result);
    }

现在我想测试我的添加方法。

我的存储库有一个方法SaveOrUpdate,它接受Person类型和字符串的两个参数。

我似乎无法进行测试。 任何人都可以帮助我吗?

我的存储库上的方法如下所示:

 public virtual void SaveOrUpdatePersoon(Person persoon, string userName)
    {
        using (DbContextTransaction transactionScope = DbContext.Database.BeginTransaction())
        {
                DbContext.Persons.AddOrUpdate(persoon);
                DbContext.SaveChanges();
        }
    }

1 个答案:

答案 0 :(得分:2)

首先,您应该尝试提供有关您要执行的操作的更多信息。 对我来说,似乎你并没有真正测试任何测试。你正在测试你的嘲讽是否有效,我想这不是你的意图。

您是否尝试测试存储库与DatabaseContext的交互? 如果是这样,您应该在模拟的DatabaseContext上使用Verify。为了能够帮助您,请提供更多信息。

尝试这样的事情

    Persoon p = new Domain.Person { ID = 1}
_persoonRepository = new PersonRepository(mockContext.Object);
_persoonRepository.SaveOrUpdatePersoon(p, 2);
mockContext.Verify(x => x.Persons.SaveOrUpdate(p), Times.Once)

这是制作SaveOrUpdate虚拟

的替代方法
[Test]
        public void Method()
        {
            Person p = new Person {Id = 1};
            var mockSet = new Mock<IPersons>();
            var mockContext = new Mock<DatabaseContext>();
            mockContext.Setup(m => m.Persons).Returns(mockSet.Object);
            var repository = new Repository(mockContext.Object);
            repository.SaveOrUpdatePerson(p, 2);
            mockSet.Verify(x => x.SaveOrUpdate(p, 2), Times.Once);
        }


        public class Repository
        {
            private DatabaseContext databaseContext;

            public Repository(DatabaseContext databaseContext)
            {
                this.databaseContext = databaseContext;
            }

            public void SaveOrUpdatePerson(Person p, int id)
            {
                databaseContext.Persons.SaveOrUpdate(p, id);
            }
        }

        public class DatabaseContext
        {
            public virtual IPersons Persons { get; set; }
        }

        public interface IPersons
        {
            // add whatever else needed here
            void SaveOrUpdate(ModelJsonSerializationTest.Person p, int id);
        }

        public class Persons : IPersons
        {
            List<Person> persons = new List<Person>();
            public void SaveOrUpdate(Person p, int  id)
            {
                if (persons.Any(x => x.Id == id)) // whatever you are using id for
                { //Do update here
                }
                else
                {
                    persons.Add(p);
                }
            }
        }

        public class Person
        {
            public int Id { get; set; }
        }