Почему это соответствие параметра 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 ответ
Я вижу три аспекта здесь:
Когда метод с возвращаемым значением ссылочного типа вызывается для фиктивного объекта, и для вызова не было настроено поведение, фиктивный объект будет возвращать фиктивный объект. Если хочешь вернуть
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);
Я считаю, что ваше "обходное" решение более элегантно, чем эти две установки.
Когда вы сопоставляете аргумент вызова метода для равенства, нет необходимости использовать
Param.Is()
, Вы можете просто настроить поведение сhost.WhenToldTo(h => h.GetTenantInstance(new Uri("http://foo.bar"))) .Return(new TenantInstance());
- Тот факт, что вы получаете исключение при использовании
Param.Is()
вот недостаток Machine.Fakes. Я не вижу причин, почему это не должно работать. Я исправлю это в какой-то момент и дам вам знать.