.Net核心单元测试

时间:2018-10-27 16:42:52

标签: c# unit-testing moq xunit.net

我有一个如下所示的Web api,可以从我的angularjs用户界面中调用它。

public class ValuesController : Controller
{
    private static string dynamoDbTable = string.Empty;
    private readonly IDynamoDbManager<MyModel> _dynamoDbManager;

    public ValuesController(IOptions<Dictionary<string, string>> appSettings, IDynamoDbManager<MyModel> dynamoDbManager)
    {
        var vals = appSettings.Value;
        dynamoDbTable = vals["dynamoDbTable"];
        _dynamoDbManager = dynamoDbManager;
    }

[HttpGet("api/data")]
public async Task<IActionResult> GetAllData(string status, string role)
{
    List<ScanCondition> conditions = new List<ScanCondition>();
    conditions.Add(new ScanCondition("status", ScanOperator.Contains, status));
    conditions.Add(new ScanCondition("role", ScanOperator.Contains, role));

    List<MyModel> model = new List<MyModel>();
    model = await _dynamoDbManager.GetAsync(conditions);            

    return Ok(model);
}

[HttpPost("api/save")]
public async Task<IActionResult> SaveData([FromBody] List<MyModel> listData, string input, string name, string type)
{
    List<MyModel> model = new List<MyModel>();
    foreach (var data in listData)
    {
        //populating data here and saving
         await _dynamoDbManager.SaveAsync(data);
    }
    return Ok();
}
}

}

现在,我想为我的API端点编写测试用例。我之前没有编写任何单元测试用例,因此需要输入。我在这里阅读了xunit的基本文档。

这是我的示例测试方法:

public class ValuesControllerTests
{
    private Mock<IDynamoDbManager<MyModel>> _dbManager;
    private ValuesController _valueController;

    public ValuesControllerTests()
    {
        var mockRepository = new MockRepository(MockBehavior.Loose);
        _dbManager = mockRepository.Create<IDynamoDbManager<MyModel>>();
        var options = new OptionsWrapper<Dictionary<string, string>>(new Dictionary<string, string>()
        {
            {"dynamoDbTable", nameof(MyModel) }
        });
        _valueController = new ValuesController(options, _dbManager.Object);
    }

[Fact]
public async Task GetAllData_Test()
{
    var searchResult = new List<MyModel>()
    {
        new MyModel(){ }
    };

     //Here I am trying to use MOQ but this is not working fine
    _dbManager
     .Setup(_ => _.GetAsync(It.IsAny<List<ScanCondition>>()))
     .ReturnsAsync(searchResult);

    var result = _valueController.GetAllData("new", "admin");
    Assert.IsType<OkObjectResult>(result.Result);            
} 
}
 }

我可以不使用最小起订量来测试我的方法吗?因为使用moq,我无法测试。 其次,在测试案例上方,我只是在检查api方法是否返回OK。我可以为get和save方法编写哪些其他测试用例。

我还创建了一个git项目,以防任何人想查看以下项目:https://github.com/kj1981/xunit

如果有人可以帮助我,将不胜感激。

-添加-

我还尝试了以下一种测试,但这可以吗?可能是我的想法是错误的,通过以下测试,我认为它会失败,但不会失败。

     [Fact]
    public async Task GetAllData_Test()
    {
        var searchResult = new List<MyModel>()
        {
            new MyModel(){ Id ="1", Name = "Adam", Role = "User", Status ="old" },
            new MyModel(){ Id ="2", Name = "Gary", Role = "Admin", Status ="new" }
        };

        _dbManager
         .Setup(_ => _.GetAsync(It.IsAny<List<ScanCondition>>()))
         .ReturnsAsync(searchResult);

        var okResult = _valueController.GetAllData("fail", "none").Result as OkObjectResult; ;
        var items = Assert.IsType<List<MyModel>>(okResult.Value);
        Assert.Equal(2, items.Count);
    }

有输入的人吗?

0 个答案:

没有答案