Ограничение списка носорогов Rhino - PullRequest
7 голосов
/ 22 сентября 2011

Я пытаюсь утверждать, что метод был вызван на заглушку. Метод, который я пытаюсь утвердить, был вызван на IEnumerable<string> Я не забочусь о точном содержании, но я просто хочу проверить, что число является определенным числом. Я не могу получить правильное утверждение, я получаю

Rhino.Mocks.Exceptions.ExpectationViolationException : Bob.DoThings(collection count equal to 10); Expected #1, Actual #0.

Я знаю, что DoThings () действительно вызывается ... Я просто не могу правильно установить ограничение ..

var myBob= MockRepository.GenerateStub<Bob>();
var countConstraint =   Rhino.Mocks.Constraints.List.Count(Rhino.Mocks.Constraints.Is.Equal(10));

// execution code....
Joe myJoe = new Joe(myBob);
myJoe.MethodThatShouldCallDoThingWith10();

myBob.AssertWasCalled(s => s.DoThings(null), o => Constraints(countConstraint));

Я также пытался добавить "IgnoreArguments" в качестве ограничения. Чего мне не хватает?

Ответы [ 2 ]

11 голосов
/ 23 сентября 2011

Проблема здесь с отложенным исполнением.До тех пор, пока не будет перечислено IEnumerable<string>, список элементов «построен».Так как Rhino.Mocks просто записывает то, что вызывается, он никогда не «использует» аргументы метода и, следовательно, список никогда не создается и не перечисляется.Как вы уже видели, добавление ToList () или ToArray () перечисляет и создает список, чтобы тест прошел, если вы используете один из этих методов.

Один из способов - захватить список, переданный вметод и проверьте это:

var list = (IEnumerable<int>) myBob.GetArgumentsForCallsMadeOn(b => b.DoThings(null))[0][0];
Assert.AreEqual(10, list.Count());

Этот тест проходит успешно и не требует никаких изменений в вашем коде.

2 голосов
/ 22 сентября 2011

Об этой проблеме уже сообщалось Здесь .Я смог воспроизвести эту проблему со следующими Бобом и Джо:

public interface Bob
{ void DoThings(IEnumrable<int> list); }

public class Joe
{
    private readonly Bob bob;

    public Joe(Bob bob)
    { this.bob = bob; }

    public void MethodThatShouldCallDoThingWith10()
    { 
          var values = Enumerable.Range(1, 100).Where(x => x > 0 && x < 11);
          bob.DoThings(values); 
    }
}

Кажется, что в Rhino Mocks все-таки есть какая-то проблема, когда дело доходит до LINQ: либо сообщите об ошибке на Ayende или добавьте ToList () в свой рабочий код (не очень рекомендуется) ...

...