2015-03-09 4 views
3

Я работаю в модульном тестировании в веб-приложении ASP.Net, теперь у меня есть доступ к моему конструктору в файле модели для тестирования, у которого есть код Server.MapPath для загрузки моего XML-файла , когда пытаюсь проверить это, я получаю ошибку, потому что HttpContext имеет значение null, поэтому мне нужно высмеивать Server.MapPath.Mocking HttpContext.server.MapPath в модульном тестировании ASP.NET

Я искал партию, но все образцы заданы только для Asp.NET MVC, но у меня есть работа в ASP.NET. поэтому, пожалуйста, помогите в ASP.NET решить эту проблему.

Мой код приведен ниже.

public class NugetPlatformModel 
{ 
    public bool IsHavingLicense { get; set; } 
    public List<PlatformProducts> PlatformProduct = new List<PlatformProducts>(); 
    public NugetPlatformModel() 
    { 
     var xmldoc = new XmlDocument(); 

     mldoc.Load(HttpContext.Current.Server.MapPath(@"~\Content\PlatformProducts.xml")); 
    } 
} 

И мой модульного тестирования кода

[Test] 
    public void Account_UnlicensedCustomerIdentity_IsStudioLicenseAndIshavinglicenseFalse() 
    { 

     //Act 
     NugetPlatformModel nugetPlatformModel = new NugetPlatformModel(); 

     //Assert 
     AssertEquals(false, nugetPlatformModel.IsHavingLicense); 

    } 

ответ

3

Это типичный код, который вызывает статические методы, это очень трудно проверить, сохраняя при этом разделение беспокойства и избежать тесной связи. Вот общий подход к тестированию и издевательствовать «непроверенный код»: напишите ему «фасадную обертку».

  • Создайте обертку для этих методов. Простой класс, который содержит методы, названные благоразумно, и только делегат на непроверяемые звонки (обычно статические вызовы)

  • Создать интерфейс для этой обертки класса

  • Вместо непосредственного вызова непроверяема метода в коде клиента, используйте обертку (вложенную зависимость, используя интерфейс, представленный на шаге 2), и вызовите на нее нормальные методы.

  • В своем модульном тесте выкрикните оболочку с поведением, которое вы хотите.

Этот подход эффективно уменьшает сцепление и отделяет проблемы, которые необходимо разделить. Конечно, вы по-прежнему не можете проверить поведение самой оболочки, но если она достаточно проста (только делегирование исходным вызовам), то это не такая большая проблема.

Обновление:

Using shims to isolate your application from other assemblies for unit testing

Shim типов один из двух технологий, что Microsoft Подделка Framework использует, чтобы позволить вам легко изолировать компоненты тестируемого от окружающей среды. Шифры переадресовывают вызовы на конкретные методы для кодирования, которые вы пишете как часть вашего теста. Многие методы возвращают разные результаты, зависящие от внешних условий, но прокладка находится под контролем вашего теста и может возвращать согласованные результаты при каждом вызове. Это делает ваши тесты намного легче писать. Используйте прокладки, чтобы изолировать свой код от сборок, которые не являются частью вашего решения. Чтобы изолировать компоненты вашего решения друг от друга, мы рекомендуем использовать заглушки.

+0

Спасибо JJJ.Я не мог изменить свой источник, есть ли другой способ? –

+1

Другой способ заключается в замене 'HttpContext.Current.Server.MapPath (@" ~ \ Content \ PlatformProducts.xml ")' на 'Path.Combine (AppDomain.CurrentDomain.BaseDirectory,« Content \ PlatformProducts.xml »)' – user01928374655647382910019283

+0

Обновлено мой ответ. Обратитесь к этому. – user01928374655647382910019283

2

Как уже ответили, вы должны отвязать система

public class NugetPlatformModel 
    { 
    public bool IsHavingLicense { get; set; } 
    public List<PlatformProducts> PlatformProduct = new List<PlatformProducts>(); 
    public NugetPlatformModel(IPlatformProductProvider provider) 
    { 
     var xmldoc = new XmlDocument(); 
     //System.Web.HttpContext.Current.Server.MapPath(@"~\Content\PlatformProducts.xml") 
     xmldoc.Load(provider.Filepath); 
    } 

    public interface IPlatformProductProvider 
    { 
     string Filepath { get; } 
    } 

    public class PlatformProductProvider: IPlatformProductProvider 
    { 
     string _filepath; 
     public string Filepath 
     { 
     get { return _filepath; } 
     set { _filepath = value;} 
     } 

     public PlatformProductProvider(string path) 
     { 
     _filepath = path; 
     } 
    } 

    } 

И ваш тест может быть:

[Test] 
    public void Account_UnlicensedCustomerIdentity_IsStudioLicenseAndIshavinglicenseFalse() 
    { 
     //Arrange 
     // using Moq 
     //var mock = new Mock<IPlatformProductProvider>(); 
     //IPlatformProductProvider provider = mock.Object; 
     //provider.Filepath = "pippo.xml"; 
     // otherwise 
      var provider = new PlatformProductProvider("pippo.xml"); 

     //Act 
     NugetPlatformModel nugetPlatformModel = new NugetPlatformModel(provider); 

     //Assert 
     AssertEquals(false, nugetPlatformModel.IsHavingLicense); 

    } 
Смежные вопросы