Когда использовать обратный вызов Mock против Return? - PullRequest
5 голосов
/ 13 января 2012

У меня, как мне кажется, довольно простая настройка, в которой тип поиска создается и пропускается через уровень обслуживания и в хранилище, где возвращается список типа домена.Тип поиска ничего не делает, кроме как создает дерево выражений в методе репозитория, и в основном возвращаются результаты из базы данных.Довольно просто

Интерфейс репозитория:

public interface IDoNotSolicitRepo 
{
    IList<DNSContract> SelectWithCriteria(DNS_Search searchriteria); 
}

Служба, реализующая репозиторий:

public class DoNotSolicitService : BaseBLLService, IDoNotSolicitService
{
    private readonly IDoNotSolicitRepo repo;
    private readonly IPartnerService partnerService;
    private readonly IDoNotSolicitReasonService dnsReasonSvc;
    public DoNotSolicitService(IDoNotSolicitRepo _repo, IPartnerService _partnerSvc, IDoNotSolicitReasonService _dnsReasonSvc)
    {
        repo = _repo;
        partnerService = _partnerSvc;
        dnsReasonSvc = _dnsReasonSvc;
    }

    public ServiceResult<DNSContract> SelectWithCriteria(DNS_Search searchriteria)
    {
        var results = repo.SelectWithCriteria(searchriteria);

        return ReturnServiceResult(results);
    }
}

Я работаю над изучением Moq с этим проектом и могуне могу понять, должен ли я использовать Callback () или Return ().Я получаю общие баллы обоих, но ни один из них, похоже, не работает должным образом для меня в данный момент.

Тест:

[Test]
public void SelectWithCriteria_FirstName()
{
    mockRepository.Setup(mr => mr.SelectWithCriteria(It.IsAny<DNS_Search>()))
        .Returns((IList<DNSContract> records) => new List<DNSContract>
                                                     {
                                                         new DNSContract {FirstName = "unit", LastName = "test"},
                                                         new DNSContract {FirstName = "moq", LastName = "setup"}
                                                     });

    dnsSvc = new DoNotSolicitService(mockRepository.Object, new PartnerServiceStub(), new DoNotSoicitReasonServiceStub());

    var result = dnsSvc.SelectWithCriteria(new DNS_Search { FirstName = "unit" });

    Assert.IsNotNull(result);
    Assert.IsTrue(result.Data.Any());
}

Ошибка:

System.ArgumentException was unhandled by user code


 Message=Object of type 'EP.Rest.Common.RestHelpers.DNS_Search' cannot be converted to type 'System.Collections.Generic.IList`1[EP.Rest.Domain.Contracts.DNSContract]'.

Теперь я прочитал, что метод Returns () возвращает переданный тип, поэтому я вижу, что причина этой ошибки.Но в реальном мире я хочу, чтобы другой тип вернулся.Я попытался создать делегата обратного вызова, но ничего из этого не показалось правильным.

1 Ответ

3 голосов
/ 13 января 2012

Просто бросьте лямбду на. Возврат, т.е.

.Returns(new List<DNSContract>());

Ваш оригинал передает аргументы из вашего метода в возвращаемые значения для параметризации результатов, например, при извлечении из источника, который может возвращать разные данные в зависимости от ввода.

Или

.Returns<IList<DNSContract>>(new List<DNSContract>(){...});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...