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