Вы, вероятно, поняли, что причина, по которой вы получаете исключения из ваших методов расширения, заключается в нереализованных свойствах или методах в макетируемых объектах, например Запрос на HttpContextBase или RequestContext на UrlHelper.
Взгляните на некоторые из опубликованных стратегий здесь , чтобы узнать, как имитировать вызовы метода расширения. Лично я предпочитаю эту стратегию , которая позволит вам рефакторизовать ваши методы расширения для замены ставок во время исполнения.
Например, вместо:
public static class UrlHelperExtensions
{
public static string GetReturnUrl(this UrlHelper helper)
{
return // your implementation of GetReturnUrl here
}
}
Вы бы получили:
public interface IUrlHelperExtensions
{
string GetReturnUrl(UrlHelper helper);
}
public static class UrlHelperExtensions
{
public static IUrlHelperExtensions Extensions(this UrlHelper target)
{
return UrlHelperExtensionFactory(target);
}
static UrlExtensions
{
UrlHelperExtensionFactory = () => new DefaultUrlHelperExtensionStrategy();
}
public static Func UrlHelperExtensionFactory { get; set; }
}
public DefaultUrlHelperExtensionStrategy : IUrlHelperExtensions
{
public string GetReturnUrl(UrlHelper helper)
{
return // your implementation of GetReturnUrl here
}
}
Вам нужно изменить способ вызова методов расширения с urlHelper.GetReturnUrl () на urlHelper.Extensions (). GetReturnUrl (), и во время модульного тестирования вы можете установить UrlHelperExtensions.UrlHelperExtensionFactory в качестве поддельного объект, но таким образом, вы можете контролировать поведение методов расширения во время теста.