2017-06-05 77 views
1

全新的测试,我有一个控制器是这样的:如何使用XUnit编写简单的测试用例?

public class CheckRegController : Controller 
{ 
    private readonly ApplicationDbContext _context; 
    private readonly AppSettings _appSettings; 

    public CheckRegController(ApplicationDbContext context, IOptions<AppSettings> appSettings) 
    { 
     _context = context; 
     _appSettings = appSettings.Value; 
    } 

    [HttpGet] 
    public IActionResult Get(string var1, int numberusers) 
    { 
     //... 
    } 
} 

现在我已经加入其中,我想使用的xUnit和最小起订量的测试项目。我只是想创建控制器就像我在一个非常简单的项目都做的一个对象,但它不能在this.When工作,我想:

CheckRegController cr = new CheckRegController(); 

它说:

有没有给定的参数对应于 所需的正式 参数 '语境' 'CheckRegController.CheckRegController(ApplicationDbContext, IOptions)' XUnitTestProjectOA

钍EN我试过了:

var moqHome = new Mock<ApplicationDbContext>(); 

但我不知道是否正确或者我需要做什么? 如何通过_context_appsettings ??

回答

0

你在正确的轨道上。嘲笑依赖关系并将它们注入测试中的主题。

//Arrange 
var dbmock = new Mock<ApplicationDbContext>(); 
//...setup dbmock as needed to exercise test 
var options = new Mock<IOption<AppSetting>(); 
var appSetting = new AppSetting { 
    //...populate appSetting as needed to exercise test 
}; 
options.Setup(_ => _.Value).Returns(appSetting); 

var sut = new CheckRegController(dbMock.Object, options.Object); 
var var1 = "testing"; 
var numberusers = 2; 

//Act 
var actual = sut.Get(var1,numberusers) 

//Assert 
//...assert expected behavior to actual. 

我也建议抽象掉上下文以使控制器更易于维护。

+0

这正是我想要的......但在UnitTestProject的情况下,我们使用[TestMethod]属性,并通过单击测试用例我们可以运行任何测试用例,但在XUnitTestCase中,我有[Fact]属性,我无法运行测试用例?如何运行它?我正在使用命令:dotnet test -method namespace.projectname.methodname?但它不起作用。 – Mogli

+0

它给我dbmock.object上的错误 - Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:'无法实例化类的代理:abc.Data.ApplicationDbContext。? – Mogli

+0

@Mogli这就是为什么我已经提出了关于抽象数据库上下文以提供更多灵活性的原因。 – Nkosi

相关问题