在存储库上对 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();
}
}
首先,您应该尝试提供更多有关您要做的事情的信息。对我来说,你似乎并没有真正用你的测试测试任何东西。你正在测试你的嘲笑是否有效,我想这不是你的意图。
您是否正在尝试测试存储库是否与数据库上下文交互?如果是这样,则应改用模拟数据库上下文上的验证。为了能够帮助您,请提供更多信息。
尝试这样的事情
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; }
}