2016-03-18 4 views
0

Я новичок в Asp.net 5 и задаю вопрос об модульном тесте.Единичный тест для Asp.Net 5 MVC без запуска Startup.cs

Класс Я собираюсь проверить как следовать

public class TargetController : Controller 
{ 
    private readonly ITargetRepository _targetRepository; 
    public TargetController(ITargetRepository targetRepository) 
    { 
     this._targetRepository = targetRepository; 
    } 
    // GET: /<controller>/ 
    public IActionResult Index() 
    { 
     return this.View("Index"); 
    } 
} 

где TargetRepository является

public class TargetRepository : ITargetRepository 
{ 
    private readonly TargetContext _context; 

    public TargetRepository(TargetContext context) 
    { 
     this._context = context; 
    } 
} 

и TargetContext является

public class TargetContext : DbContext 
{ 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     string connectionString = Startup.Configuration["Data:TargetContextConnection"]; 
     optionsBuilder.UseSqlServer(connectionString); 
     base.OnConfiguring(optionsBuilder); 
    } 
} 

Тест код

public class TargetControllerTests 
{ 
    private readonly TargetController _controller; 

    public TargetControllerTests() 
    { 
     this._controller = new TargetController(new TargetRepository(new TargetContext())); 
    } 

    [Fact()] 
    public void IndexActionResultTest() 
    { 
     ViewResult vr = this._controller.Index() as ViewResult; 
     Assert.NotNull(vr); 
     Assert.Equal("Index", vr.ViewName); 
    } 
} 

Проблема заключается в следующем. В TargetContext я использовал

Startup.Configuration["Data:TargetContextConnection"] 

, чтобы получить строку подключения к базе данных, которая определена в файле Startup.cs. Поскольку я просто тестировал функцию Index в TargetController, я не запускал Startup.cs. В результате я получил NULLException для Startup.Configuration. Мне интересно, как я могу решить эту проблему и запустить мой модульный тест.

спасибо.

+0

Вы должны издеваться свой контекст базы данных, а также. Единичный тест никогда не должен использовать «реальные» данные из базы данных. –

+0

Спасибо, Стивен. Затем я думаю, что мне нужно создать строку подключения для моего теста, а не использовать конфигурацию в моем целевом проекте. – Ben

+0

Какую насмешливую структуру вы используете? –

ответ

0

Используя Moq, ваш тест должен выглядеть следующим образом:

public class TargetControllerTests 
{ 

    private readonly Mock<ITargetRepository> _targetRepository; 
    private readonly TargetController _controller; 

    public TargetControllerTests() 
    { 
     _targetRepository = new Mock<ITargetRepository>(); 
     this._controller = new TargetController(_targetRepository.Object); 
    } 

    [Fact()] 
    public void IndexActionResultTest() 
    { 
     ViewResult vr = this._controller.Index() as ViewResult; 
     Assert.NotNull(vr); 
     Assert.Equal("Index", vr.ViewName); 
    } 
} 
+0

Привет, andreasnico. Спасибо за ваш ответ. У меня проблема, когда я использую moq в своем проекте. Я задал вопрос в http://stackoverflow.com/questions/36102010/using-moq-in-asp-net-5-with-dnx50. Не могли бы вы помочь мне понять, как я могу решить проблему? Спасибо. – Ben

+0

@Ben Я проверил его, и мне жаль, что я не знаю об этой проблеме – andreasnico

+0

Спасибо andreasnico. – Ben

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