Moq: Проверьте, был ли SendAsync объекта Target Lock вызван [дубликат]

*args и **kwargs - общая идиома, позволяющая произвольному количеству аргументов функциям, описанным в разделе , больше о определении функций в документации Python.

] *args предоставит вам все функциональные параметры как кортеж :

In [1]: def foo(*args):
   ...:     for a in args:
   ...:         print a
   ...:         
   ...:         

In [2]: foo(1)
1


In [4]: foo(1,2,3)
1
2
3

**kwargs предоставит вам все аргументы ключевого слова, кроме тех, которые соответствуют формальному параметру как словарь.

In [5]: def bar(**kwargs):
   ...:     for a in kwargs:
   ...:         print a, kwargs[a]
   ...:         
   ...:         

In [6]: bar(name='one', age=27)
age 27
name one

Оба идиома могут быть смешаны с нормальными аргументами, чтобы разрешить набор фиксированных и некоторых переменных:

def foo(kind, *args, **kwargs):
   pass

Другое использование *l idiom - распаковывать списки аргументов при вызове функции.

In [9]: def foo(bar, lee):
   ...:     print bar, lee
   ...:     
   ...:     

In [10]: l = [1,2]

In [11]: foo(*l)
1 2

В Python 3 можно использовать *l в левой части задания ( Extended Iterable Unpacking ), хотя в этом контексте он содержит список вместо кортежа:

first, *rest = [1,2,3,4]
first, *l, last = [1,2,3,4]

Также Python 3 добавляет новую семантику (см. PEP 3102 ):

def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
    pass

Такая функция принимает только 3 позиционных аргумента, и все после * может быть передано только как аргументы ключевого слова .

116
задан Ruben Bartelink 19 February 2010 в 13:43
поделиться

4 ответа

Я использовал Wrapper, чтобы обойти эту проблему. Создайте объект-обертку и передайте свой издеваемый метод.

См. Издевательские статические методы для модульного тестирования Paul Irwin, у него есть хорошие примеры.

12
ответ дан Alvis 24 August 2018 в 03:13
поделиться
  • 1
    Мне нравится этот ответ, потому что то, что он говорит (без прямого объяснения), вам нужно изменить свой код, чтобы он был доступен для тестирования. Вот как это работает. Поймите, что в разработке микрочипов / IC / ASIC эти чипы должны быть не только предназначены для работы, но и еще более тщательно проверяемы, потому что, если вы не можете протестировать микрочип, это бесполезно - вы не можете гарантировать, что он будет Работа. То же самое касается программного обеспечения. Если вы не построили его для проверки, это ... бесполезно. Постройте его для проверки, что в некоторых случаях означает переписывание кода (и использование оберток), а затем создание автоматических тестов, которые его проверяют. – Michael Plautz 22 December 2017 в 05:35

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

Я просмотрел с использованием расширения, добавив добавление кода непосредственно к вашему методу. Это мне не нужно было издеваться над тем, что происходит внутри расширения, а не с самим расширением.

4
ответ дан chris31389 24 August 2018 в 03:13
поделиться

Мне нравится использовать обертку (шаблон адаптера), когда я обертываю сам объект. Я не уверен, что использую это для переноса метода расширения, который не является частью объекта.

Я использую внутреннее Lazy Injectable Property любого типа Action, Func, Predicate или делегата и (g3)

    internal Func<IMyObject, string, object> DoWorkMethod
    {
        [ExcludeFromCodeCoverage]
        get { return _DoWorkMethod ?? (_DoWorkMethod = (obj, val) => { return obj.DoWork(val); }); }
        set { _DoWorkMethod = value; }
    } private Func<IMyObject, string, object> _DoWorkMethod;

Затем вы вызываете Func вместо фактического метода.

    public object SomeFunction()
    {
        var val = "doesn't matter for this example";
        return DoWorkMethod.Invoke(MyObjectProperty, val);
    }

Для более полного примера , проверьте http://www.rhyous.com/2016/08/11/unit-testing-calls-to-complex-extension-methods/

1
ответ дан Rhyous 24 August 2018 в 03:13
поделиться
  • 1
    Это хорошо, но читатели должны знать, что _DoWorkMethod - это новое поле класса, которое каждый экземпляр класса теперь должен выделить еще одно поле. Редко это бывает, но иногда это происходит в зависимости от количества экземпляров, которые вы выделяете в любой момент времени. Вы можете обойти эту проблему, ставя статический _DoWorkMethod. Недостатком этого является то, что если у вас одновременно будут выполняться единичные тесты, завершатся два разных модульных теста, которые могут изменять одно и то же статическое значение. – zumalifeguard 2 November 2016 в 02:07

Вы не можете «прямо» высмеять статический метод (следовательно, метод расширения) с насмешливой структурой. Вы можете попробовать Moles ( http://research.microsoft.com/en-us/projects/pex/downloads.aspx ), бесплатный инструмент от Microsoft, который реализует другой подход. Ниже приведено описание инструмента:

Moles - это легкая структура для тестовых заглушек и обходов в .NET, основанная на делегатах.

Моли могут использоваться для обхода любой метод .NET, в том числе не виртуальные / статические методы в закрытых типах.

Вы можете использовать Moles с любой тестовой средой (независимо от этого).

23
ответ дан xan 24 August 2018 в 03:13
поделиться
  • 1
    Помимо Moles, существуют другие (несвободные) фальшивые фреймворки, которые используют API-интерфейс профилирования .NET для издевательства объектов и поэтому могут заменять любые вызовы. Я знаю, это Telerik JustMock и TypeMock Isolator . – Marcel Gosselin 24 August 2011 в 05:34
  • 2
    Молы в теории хороши, но я обнаружил три проблемы, когда я пробовал это, что остановило меня, используя его ... 1) Он не запускается в бегунке Resharper NUnit 2) Вам нужно вручную создать узел мола для каждой заглубленной сборки 3 ) Вам нужно вручную воссоздать сборку мола всякий раз, когда меняет шаблон. – Russell Giddings 26 August 2011 в 14:41
Другие вопросы по тегам:

Похожие вопросы: