2015-11-30 7 views
0
public class DemoController : Controller 
{ 


    private readonly ICommonOperationsRepository _commonRepo; 

    public DemoController (ICommonOperationsRepository commonRepo) 
    { 
     _commonRepo = commonRepo; 
    } 
    public ActionResult Default() 
    { 
     var model = new DemoModel(); 
     try 
     { 
      **ConcreteClass cc = new ConcreteClass(Request.ServerVariables["HTTP_X_REWRITE_URL"].ToString()); 
      cc.ConcreteClassMethod();** 

      model.ListTopListing.AddRange(_commonRepo.GetListings()); 
     } 
     catch (Exception ex) 
     { 
      ExceptionHandler objErr = new ExceptionHandler(ex, "DemoController .Default()\n Exception : " + ex.Message); 
      objErr.LogException(); 
     } 
     return View(model); 
    } 

}Пропустите выполнение метода для модульного тестирования контроллера потока

Я пытаюсь проверить мой блок управления. Конкретный конструктор ConcreteClass и его метод ConcreteClassMethod имеют некоторую зависимость от переменных HttpRequest, которые я не могу передать из своих модульных тестов.

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

+1

Вы не можете создать новый экземпляр объекта и остановить вызов конструктора. Вам нужно будет создать пустой конструктор без параметров. Либо это, либо перераспределить способ работы ваших методов. Вы также можете ввести значение с помощью инъекции зависимостей. – Luke

+0

Не знаете, как это сделать. Не могли бы вы объяснить это подробно? – maverick

+0

Пожалуйста, см. Мой ответ, особенно последний бит, который я только что добавил. Если вам нужна дополнительная информация, дайте мне знать. – Luke

ответ

0

Вы не можете создать новый экземпляр объекта и остановить вызов конструктора. Вам нужно будет создать пустой конструктор без параметров.

public class ConcreteClass 
{ 
    private string MyString; 

    // Your constructor 
    public ConcreteClass(string myString) 
    { 
     this.MyString = myString; 
    } 

    // Parameterless constructor 
    public ConcreteClass() 
    { 
     // Do nothing, no code 
    } 

    // A method that might use MyString 
    public void DoSomethingWithMyString() 
    { 
     var trimmedString = this.MyString.Trim(); 
    } 
} 

Либо это, либо переделаны так, что ваши методы работы, так что он не опирается на имеющей строку, переданную в на конструкторе:

public class ConcreteClass 
{   
    // No constructor required anymore 

    // Pass the string in to the methods that need the string 
    public void DoSomethingWithMyString(string myString) 
    { 
     var trimmedString = myString.Trim(); 
    } 

    // Pass the string in to the methods that need the string 
    public void DoSomethingElseWithMyString(string myString) 
    { 
     var trimmedString = Int32.Parse(myString); 
    } 
} 

Однако, это, вероятно, не решить эту проблему, имея в виду, что вы хотите, чтобы ввести свой Request переменную и не имеют доступа к ним, вы не можете просто сделать следующее:

public class DemoController : Controller 
{ 
    private string HttpRewriteUrl; 

    public DemoController() 
    { 
     this.HttpRewriteUrl = Request.ServerVariables["HTTP_X_REWRITE_URL"].ToString(); 
    } 

    // Custom constructor for unit testing 
    public DemoController(string httpRewriteUrl) 
    { 
     this.HttpRewriteUrl = httpRewriteUrl; 
    } 

    public ActionResult Default() 
    { 
     // Get the value from the object 
     ConcreteClass cc = new ConcreteClass(this.HttpRewriteUrl); 
     cc.ConcreteClassMethod(); 
    } 
} 

в настоящее время в вашей Unit Tests лет u может использовать второй конструктор и передать значение в:

var controller = new DemoController("your value to pass in here"); 
controller.Default(); 
+0

Проблема в том, что cc.ConcreteClassMethod() также имеет доступ к некоторым переменным запроса, которые я хочу избежать. – maverick

+0

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

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