存储库上的单元测试保存或更新方法
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; }
}
我正在编写单元测试。我正在使用最小起订量和 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; }
}