2016-03-09 10 views
0

У меня есть метод:метод контролирующая вызова с точными аргументами с TypeMock

public bool Foo(params Object[] list) 
{ 
    //Some manipulations with list 
    return true; 
} 

И я хочу, чтобы убедиться, что он вызывается с правильными параметрами. Я сделал все это, как и в docs:

[TestMethod, Isolated] 
public void TestArgs() 
{ 
    var bar = new Bar(); 

    Isolate.WhenCalled(() => bar.Foo()).CallOriginal(); 

    string arg1 = "Apple"; 
    string arg2 = "Pear"; 
    string arg3 = "Potato"; 
    bar.Foo(arg1, arg2, arg3); 

    Isolate.Verify.WasCalledWithArguments(() => bar.Foo(null, null, null)).Matching(a => 
     (a[0] as string).Equals(arg1) && 
     (a[1] as string).Equals(arg2) && 
     (a[2] as string).Equals(arg3) 
    ); 
} 

Но я получаю исключение:

System.NullReferenceException: ссылка на объект не указывает на экземпляр объекта.

Может кто-нибудь сказать мне, почему я его получаю?

ответ

2

Отказ от ответственности, я работаю в Typemock.

Дело в том, что вы используете ключевое слово 'params'. Он переносит все аргументы в один объект - массив аргументов. Поэтому для правильной проверки «params» используйте следующую инструкцию:

Isolate.Verify.WasCalledWithArguments(() => bar.Foo(null)).Matching(a => 
    (a[0] as string[])[0].Equals(arg1) && 
    (a[0] as string[])[1].Equals(arg2) && 
    (a[0] as string[])[2].Equals(arg3) 
); 

Удачи вам!

+0

Спасибо! Прекрасно работает –

1

Вы пытались его отладить?

Тем не менее, если изменить последнее заявление в

Isolate.Verify.WasCalledWithExactArguments(() => bar.Foo(arg1, arg2, arg3)); 

тест будет пройден.

+0

Да, это работает, но все же я не понимаю, почему я получаю исключение! –