Проверка метода с массивом, переданным по ссылке, используя Moq - PullRequest
1 голос
/ 12 апреля 2010

Учитывая следующий интерфейс

public interface ISomething {
  void DoMany(string[] strs);
  void DoManyRef(ref string[] strs);
}

Я хотел бы убедиться, что метод DoManyRef вызван и передан любой строковый массив в качестве параметра strs. Следующий тест не пройден:

public void CanVerifyMethodsWithArrayRefParameter() {
  var a = new Mock<ISomething>().Object;
  var strs = new string[0];
  a.DoManyRef(ref strs);
  var other = It.IsAny<string[]>();
  Mock.Get(a).Verify(t => t.DoManyRef(ref other));
}

В то время как следующее, не требующее массива, переданного по ссылке, проходит:

public void CanVerifyMethodsWithArrayParameter() {
  var a = new Mock<ISomething>().Object;
  a.DoMany(new[] { "a", "b" });
  Mock.Get(a).Verify(t => t.DoMany(It.IsAny<string[]>()));
}

Я не могу изменить интерфейс , чтобы исключить требование по ссылке.

1 Ответ

1 голос
/ 22 сентября 2010

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

[Test]
public void CanVerifyMethodsWithArrayRefParameter()
{
    var a = new Mock<ISomething>().Object;
    var strs = new string[0];
    a.DoManyRef(ref strs);
    Mock.Get(a).Verify(t => t.DoManyRef(ref strs));
}

Последнее предложение вопроса заставляет меня поверить, что вы не сможете сделать это изменение, но это то, что требуется для успешного вызова Verify. Надеюсь, это поможет.

...