如何从一个方法返回一个模拟对象

本文关键字:一个 模拟 对象 返回 方法 | 更新日期: 2023-09-27 18:02:05

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

和这个抽象的Repository:

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

如何从一个方法返回一个模拟对象

从你对@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);
} 

mock。对象返回IPersonRepository类型的模拟对象。GetPerson()方法的返回类型需要一个Person类型的对象。

另一件事是,您没有为Person创建模拟,所以我不明白这段代码的意义。我不确定你说的笨蛋是什么意思,但你也可以这样做:

Person GetPerson()
{
    return new Person()
                       {
                           FirstName = "Joe",
                           LastName = "Smith",
                           PhoneNumber = "555-555-5555"
                       };
}