我是Moq的新手并希望不仅在单元测试中使用它,我似乎主要是在代码中获取它。
鉴于此实体:
namespace TestBed.Domain.Entities
{
public class Person
{
public string LastName { get; set; }
public string FirstName { get; set; }
public string PhoneNumber { get; set; }
public string JobTitle { get; set; }
}
}
和这个抽象的存储库:
using TestBed.Domain.Entities;
namespace TestBed.Domain.Abstract
{
public interface IPersonRepository
{
Person GetPerson();
}
}
我想使用Moq填充一个虚拟人(!)并将该填充的“对象”传递给Repository方法。我该怎么做?
using TestBed.Domain.Abstract;
using TestBed.Domain.Entities;
using Moq;
namespace TestBed.Domain.Concrete
{
public class MockPersonReqpository
{
Person GetPerson()
{
Mock<IPersonRepository> mock = new Mock<IPersonRepository>();
mock.Setup(m => m.GetPerson()).Returns(new Person()
{
FirstName = "Joe",
LastName = "Smith",
PhoneNumber = "555-555-5555"
});
return mock.Object // NO
}
}
}
答案 0 :(得分:10)
从你对@ Daniel的答案的评论中,你似乎只需要模拟存储库本身。您仍然希望返回一个正确的Person
对象,您只是不关心存储库实际上是如何为测试目的检索该人的。
除了单元测试之外,我也不理解你在其他地方使用Moq的评论。 Moq的全部意义在于你可以伪造一个实际的对象用于测试目的(可能更好地说,但这是要点)。
由于我不知道你要测试的是什么,我将给出一个简单的例子:
[TestMethod]
public void WhenValidRequest_ThenReturnSuccess()
{
Mock<IPersonRepository> personRepository = new Mock<IPersonRepository>();
personRepository.Setup(r => r.GetPerson()).Returns(
new Person()
{
FirstName = "Joe",
LastName = "Smith"
/*...*/
});
Foo objectUnderTest = new Foo(personRepository.Object);
bool result = objectUnderTest.MakeRequest();
// Call method using the person repository that you want to test.
// You don't actually care how the repository works, you just want to return a success
// boolean when a person exists for that request.
Assert.IsTrue(result);
}
答案 1 :(得分:4)
mock.Object返回类型为IPersonRepository的模拟。 GetPerson()方法的返回类型需要Person类型的对象。
另一件事是你没有为Person创建一个模拟器,所以我没有看到这个代码的重点。我不确定你的意思是什么,但你也可以这样做:
Person GetPerson()
{
return new Person()
{
FirstName = "Joe",
LastName = "Smith",
PhoneNumber = "555-555-5555"
};
}