存储库上的单元测试保存或更新方法

Unittest saveorupdate-method on a repository

我正在编写单元测试。我正在使用最小起订量和 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();
        }
    }

首先,您真的应该尝试提供有关您正在尝试做的事情的更多信息。 在我看来,您似乎并没有真正通过测试测试任何东西。您正在测试您的模拟是否有效,我猜这不是您的意图。

您是否正在尝试测试您的存储库是否与 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; }
        }