Насмешливые родовые методы в Moq с интерфейсом - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь настроить moq для следующего универсального интерфейса, но получаю исключение

 public interface IReadAccess<TEntity>
 {
     Task<IEnumerable<TEntity>> GetAll();
 }

var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);

m.Setup(p => p.GetAll()).ReturnsAsync(new List<Foo>());

m.VerifyAll();

Получение исключения ниже

Moq.MockException
  HResult=0x80131500
  Message=The following setups on mock
    'Mock<EPIC.CrossCutting.Interfaces.DAL.Framework.IReadAccess<EPIC.CrossCutting.DTOs.Data.Announcement.AnnouncementCrosscutDTO>:00000002>' 
  were not matched:
IReadAccess<AnnouncementCrosscutDTO> p => p.GetAll()

  Source=Moq
  StackTrace:
   at Moq.Mock.VerifyAll()
   at EPIC.Tests.Business.Rules.Announcements.AnnouncementPlanning.CrosscutsProgrammaticActivitiesValidationRuleServiceTests.<ExecuteSuccessTest>d__5.MoveNext() 
in D:\dev\main\Tests\EPIC.Tests.Business.Rules\Announcements\AnnouncementPlanning\CrosscutsProgrammaticActivitiesValidationRuleServiceTests.cs:line 108

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Спасибо, Коннелл, это работает ожидаемо, но у меня есть метод simillar

public interface IReadAccess<TEntity>  
{  
    Task<IEnumerable<TEntity>> GetAll();   
    Task<IEnumerable<TEntity>> Find(FormattableString whereClause, object whereClauseObject);

} 

и я пытаюсь настроить

var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);
m.Setup(x => x.Find($"ID = @ID", new { ID = 5 })).ReturnsAsync(new List<Foo>());
var result = await m.Object.Find($"ID= @ID", new { ID = 5 });
m.VerifyAll();

после внесения некоторых изменений в существующий код, теперь настройка работаетхорошо, но получая ошибку на реальном сервисе при вызове из теста, обновленный код

var test = new Test {ID = 5};
object whereClause = new { ID = test.ID };
            FormattableString formattableString = $"ID = @ID";

            m.Setup(x => x.Find(formattableString, whereClause)).ReturnsAsync(new List<Foo>());

 var ruleServiceOutput = await this.testValidationRuleService.ExecuteAsync(test);

фактический код

public async Task<IRuleServiceOutput<bool>> ExecuteAsync(Test test)
        {
            var errors = new List<string>();

            object whereClause = new { ID = test.ID };
            FormattableString formattableString = $"ID = @ID";

            var output = (await m.Find(formattableString, whereClause)).ToArray();

            return new RuleServiceOutput<bool>(output.Errors.IsEmpty(), output.Errors);
        }

'IReadAccess`1.Find (ID = @ID, {ID = 5}) сбой вызова при фиктивном поведении Strict.Все вызовы на макете должны иметь соответствующую настройку. '

После настройки MockBehavior.Default все работает ожидаемо:)

0 голосов
/ 11 февраля 2019

Ваш тест не пройден правильно, потому что вы пытаетесь проверить, что GetAll () был вызван, даже если вы на самом деле не вызывали его.

Это пройдет, если вы вызовете метод в своем тесте или в коде, который вы тестируете.

[Fact]
public async Task Test1()
{
    var m = new Mock<IReadAccess<Foo>>(MockBehavior.Strict);
    m.Setup(p => p.GetAll()).ReturnsAsync(new List<Foo>());

    var result = await m.Object.GetAll();

    m.VerifyAll();
}

Подсказка была в вашем сообщении об ошибке: Сообщение = Следующие настройки на макете.... не были сопоставлены: IReadAccess p => p.GetAll ()

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