【发布时间】:2019-11-19 20:21:18
【问题描述】:
我无法让 Moq 从存储库方法返回 IEnumerable 类型。
更新 - 1
我希望我只是遗漏了一些东西,但根据要求,这里是完整的实现。
断言objResult.Value 是IEnumerable<ListItemDTO> 类型是失败的。
存储库界面
public interface IRepository
{
Task<IEnumerable<T>> GetListAsync<T>(string storedProcedure, object template);
Task<IEnumerable<T>> GetListAsync<T>(string sql, CommandType commandType, object template);
}
public interface ICRUDRepository<TEntity>
{
Task<TEntity> GetByIdAsync(long Id);
Task<int> AddAsync(TEntity entity);
Task<int> UpdateAsync(TEntity entity);
Task<int> DeleteAsync(long id);
}
public interface ITARRepository : IRepository, ICRUDRepository<TARTracker>
{
Task<IEnumerable<TARTrackerDate>> GetTARTrackerApprovedDates(long tarTrackerId);
Task<IEnumerable<TARTrackerDate>> MergeTARApprovalDateChanges(DataTable approvedDates);
}
控制器
public class TARTrackerController : Controller
{
private readonly ITARRepository Repository;
private readonly ILogger<TARTrackerController> Logger;
public TARTrackerController(ILogger<TARTrackerController> logger, ITARRepository repository)
{
Repository = repository;
Logger = logger;
}
[HttpGet("TARTrackers")]
[SwaggerResponse(HttpStatusCode.OK, typeof(IEnumerable<ListItemDTO>))]
[SwaggerResponse(HttpStatusCode.Unauthorized, null)]
[SwaggerResponse(HttpStatusCode.InternalServerError, null)]
[SwaggerResponse(HttpStatusCode.ServiceUnavailable, null)]
[Description("Get TAR Tracker List")]
public async Task<IActionResult> Get(long accountId)
{
try
{
var trackers = await Repository.GetListAsync<ListItemDTO>("spFDBGetAccountTARList", new { @ParamAccountID = accountId });
return Ok(trackers);
}
catch (Exception e)
{
Logger.LogError(LogEvents.Services, e, $"An error occured in {0}.{1}", nameof(TARTrackerController), nameof(Get));
return StatusCode((int)HttpStatusCode.InternalServerError);
}
}
}
单元测试:
public class TARTrackerControllerTests
{
public static ILogger<TARTrackerController> Logger = Mock.Of<ILogger<TARTrackerController>>();
public static Mock<ITARRepository> Repository = new Mock<ITARRepository>();
public class GetTARTrackersTests
{
[Fct]
public async Task Returns_OK_With_ListItemDTO()
{
//arrange
var id = 12345;
IEnumerable<ListItemDTO> expected = new List<ListItemDTO>();
Repository
.Setup(repo => repo.GetListAsync<ListItemDTO>(It.IsAny<string>(), It.IsAny<object>()))
.ReturnsAsync(expected);
var controller = new TARTrackerController(Logger, Repository.Object);
//act
var result = await controller.Get(id);
//assert
var objResult = Assert.IsType<OkObjectResult>(result);
Assert.Equal(typeof(IEnumerable<ListItemDTO>), objResult.Value.GetType());
}
}
}
我觉得这应该匹配。似乎无法弄清楚发生了什么。有什么帮助吗?
【问题讨论】:
-
你试过
expected.AsEnumerable()吗? -
@MuhammadHannan 是的,它仍然返回
List<T>。 -
@dbarth 实际发生的事情与您期望发生的事情相反。
-
我怀疑您希望
expected.GetType()返回IEnumerable- 请edit 发帖澄清是这种情况还是现在(以及更新示例代码+ 预期结果为@Nkosi建议) -
你真的关心实际值的类型吗?您关心的是返回值可以枚举并包含期望值。
标签: c# unit-testing .net-core moq