[英]Unable to assert ActionResult which returns jsonresult in Xunit
[英]Xunit Testing an ActionResult
我正在嘗試使用 Xunit 和 moq 編寫一個單元測試,它將從 client.GetAll() 返回數據。 在我調試client.GetAll的那一刻,只返回null。
This is my controller class
private readonly IClient _client;
public EventsController(IClient client)
{
_client = client;
}
[HttpGet]
public async Task<ActionResult<IEnumerable<EventDTO>>> List()
{
var values = await _client.GetAll();
return Ok(values);
}
我正在使用我的客戶端代碼工具。 我不確定 IOptions 是否導致問題
public class Client: IClient
{
public RestClient RestClient { get; set; }
public IOptions<MySettings>Settings { get; set; }
public Client(IOptions<MySettings>options)
{
Settings = options;
RestClient = new RestClient(options.Value.BaseUrl);
}
public async Task<List<EventDTO>> GetAll()
{
var request = new RestRequest(Settings.Value.GetAll, Method.GET);
var content = await RestClient.GetAsync<RootObject>(request);
var data = content.Events.SelectMany(con =>
con.Geometries.Select(geo =>
new EventDTO
{
Title = con.Title,
Id = con.Sources.FirstOrDefault()?.Id,
CategoriesTitle = con.Categories.FirstOrDefault()?.Title,
DateTime = geo.Date
})
).ToList();
return data;
}
這是我的測試 class。 我注意到,當我調試它時,它不會 go 進入 _client.GetAll() 方法。 這是因為我沒有正確設置 IOptionsoptions 嗎?
public class EventsControllerTests
{
private readonly EventsController _controller;
private readonly Mock<IClient> _clientService;
public EventsControllerTests()
{
_clientService = new Mock<IClient>();
_controller = new EventsController(_clientService.Object)
{
ControllerContext = new ControllerContext
{
HttpContext = new DefaultHttpContext()
}
};
}
[Fact]
public async Task Should_return_events_from_configured_service()
{
var response = new RootObject();
{
new Event()
{
Id = "sadsadsa"
};
};
var s = _clientService.Setup(x => x.Get(It.IsAny<string>())).ReturnsAsync(response);
var controllerResponse = await _controller.List();
var responseBody = controllerResponse.Value as IEnumerable<EventDTO>;
}
謝謝您的幫助。
您應該與 controller 分開測試您的GetAll
方法。 在 controller 中,您可以模擬您的客戶端。
public class EventsControllerTests
{
private readonly Mock<IClient> _clientMock;
private readonly EventsController _testeeController;
public EventsControllerTests()
{
_clientMock = new Mock<IClient>();
_testeeController = new EventsController(_clientMock.Object);
}
[Fact]
public async Task ListTest()
{
var dtoList = new List<EventDto>{new EventDto(), new EventDto()};
_clientMock.Setup(c => c.GetAll()).ReturnsAsync(dtoList);
var response = await _testeeController.List();
var jsonResult = (JsonResult) response.Result;
var dtoListFromResponse = (IEnumerable<EventDto>) jsonResult.Value;
// compare dtoListFromResponse with dtoList
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.