在存储库上对 filetest saveorupdate-method

本文关键字:filetest saveorupdate-method 存储 | 更新日期: 2023-09-27 18:31:54

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

在存储库上对 filetest saveorupdate-method

首先,您应该尝试提供更多有关您要做的事情的信息。对我来说,你似乎并没有真正用你的测试测试任何东西。你正在测试你的嘲笑是否有效,我想这不是你的意图。

您是否正在尝试测试存储库是否与数据库上下文交互?如果是这样,则应改用模拟数据库上下文上的验证。为了能够帮助您,请提供更多信息。

尝试这样的事情

    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; }
        }