Почему это соответствие параметра Machine.Fakes вызывает исключение?

Я использую Machine.Fakes.NSubstitute и хотят "подделать" возвращаемое значение так, чтобы, если входной параметр соответствовал определенному значению, он возвращал фиктивный объект, в противном случае он возвращает ноль.

Я попробовал следующее:

host.WhenToldTo(h => h.GetTenantInstance(Param.Is(new Uri("http://foo.bar"))))
    .Return(new TenantInstance());

Но это бросает следующее исключение:

System.InvalidCastException: Невозможно привести объект типа 'System.Linq.Expressions.NewExpression' к типу System.Linq.Expressions.ConstantExpression.

Мой текущий обходной путь должен сделать следующее:

host.WhenToldTo(h => h.GetTenantInstance(Param.IsAny<Uri>()))
    .Return<Uri>(uri => uri.Host == "foo.bar" ? new TenantInstance() : null);

Который немного вонючий.

1 ответ

Решение

Я вижу три аспекта здесь:

  1. Когда метод с возвращаемым значением ссылочного типа вызывается для фиктивного объекта, и для вызова не было настроено поведение, фиктивный объект будет возвращать фиктивный объект. Если хочешь вернуть null вместо этого вы должны настроить это явно. Таким образом, недостаточно настроить

    host.WhenToldTo(h => h.GetTenantInstance(Param.Is(new Uri("http://foo.bar"))))
        .Return(new TenantInstance());
    

    Вы также должны настроить другой случай примерно так:

    host.WhenToldTo(h => h.GetTenantInstance(Param<Uri>.Matches(x => !x.Equals(new Uri("http://foo.bar")))))
        .Return((TenantInstance)null);
    

    Я считаю, что ваше "обходное" решение более элегантно, чем эти две установки.

  2. Когда вы сопоставляете аргумент вызова метода для равенства, нет необходимости использоватьParam.Is(), Вы можете просто настроить поведение с

    host.WhenToldTo(h => h.GetTenantInstance(new Uri("http://foo.bar")))
        .Return(new TenantInstance());
    
  3. Тот факт, что вы получаете исключение при использовании Param.Is() вот недостаток Machine.Fakes. Я не вижу причин, почему это не должно работать. Я исправлю это в какой-то момент и дам вам знать.
Другие вопросы по тегам