Как вернуть макет объекта из метода? - PullRequest
3 голосов
/ 13 июля 2011

Я новичок в 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
        }

    }
}

Ответы [ 2 ]

10 голосов
/ 14 июля 2011

Из вашего комментария к @ ответу Даниэля кажется, что вам просто нужно смоделировать сам репозиторий. Вы по-прежнему хотите вернуть правильный 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);
} 
4 голосов
/ 13 июля 2011

mock.Object возвращает макет типа IPersonRepository. Тип возврата для метода GetPerson () предполагает наличие объекта типа Person.

Другое дело, что вы не создаете макет для Person, поэтому я не вижу смысла в этом коде. Я не уверен, что вы подразумеваете под пустышкой, но вы могли бы также сделать это:

Person GetPerson()
{
    return new Person()
                       {
                           FirstName = "Joe",
                           LastName = "Smith",
                           PhoneNumber = "555-555-5555"
                       };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...