我在XUnit中编写了一些测试来测试我的数据访问层。我实例化DAL对象和配置的方式与在实际Web应用程序中使用DAL对象和配置的方式相同(出于测试目的,该DAL对象和配置被配置为针对开发环境运行),但是XUnit会引发错误:
消息:以下构造函数参数没有匹配的灯具数据:IConfiguration配置,IMediaDataAccess媒体
我对XUnit有点陌生,所以不确定是什么问题。通常,ASP.NET会为我注入IConfiguration和IMediaDataAccess的实例,但是在这里似乎并非如此。
我的测试课程和测试用例示例:
public class DataAccessLayerTests
{
public IConfiguration Config { get; set; }
private IMediaDataAccess mediaData;
public IMediaDataAccess MediaData { get => mediaData; set => mediaData = value; }
public DataAccessLayerTests(IConfiguration config, IMediaDataAccess media)
{
this.MediaData = media;
this.Config = config;
}
public void GetAllMediaAsync_MediaListIsReturned()
{
List<Media> testData = mediaData.GetAllMedia().Result;
Assert.IsType<List<Media>>(testData);
}
}
由于以下错误,所有测试均失败:消息:以下构造函数参数没有匹配的灯具数据:IConfiguration配置,IMediaDataAccess媒体
答案 0 :(得分:0)
对于其他有此问题的人,Alexey的评论是正确的。您需要下载一个模拟框架(例如Moq),并使用它来模拟代码所期望的依赖关系。例如,以下是我的固定单元测试之一:
public void IndexDataModel_ShouldDisplayMedia()
{
var mockLogger = new Mock<ILogger<IndexModel>>();
var mockDataAccess = new Mock<IMediaDataAccess>();
mockDataAccess.Setup(media => media.GetAllMedia()).ReturnsAsync(GetTestMedia());
IndexModel indexController = new IndexModel(mockDataAccess.Object, mockLogger.Object);
var result = indexController.OnGet();
var viewResult = Assert.IsType<PageResult>(result);
var model = Assert.IsAssignableFrom<IEnumerable<Media>>(
indexController.mediaList);
}
诀窍是,您需要模拟通常依赖于注入到构造函数中的任何东西,在我的情况下,这是:
var mockLogger = new Mock<ILogger<IndexModel>>();
var mockDataAccess = new Mock<IMediaDataAccess>();
我的构造函数同时使用ILogger和IMediaDataAccess,因此我需要模拟它们。另外,当测试使用模拟的依赖项时,还有其他代码可提供伪返回值。这是通过.Setup代码行完成的。所有这些(我认为)是在调用GetAllMedia()时,模拟对象返回GetTestMedia()的内容,而不需要进行实际的调用。只要确保您编写的任何函数都具有与真实函数相同的返回类型即可。作为参考,这是我的GetTestMedia()函数:
private List<Media> GetTestMedia()
{
var listMedia = new List<Media>();
Media testMedia = new Media
{
Description = "TestDesc",
Genre = "TestGenre",
Name = "TestName",
Rating = MediaRating.Excellent,
Type = MediaType.Movie,
Id = 1
};
listMedia.Add(testMedia);
Media testMedia2 = new Media
{
Description = "TestDesc2",
Genre = "TestGenre2",
Name = "TestName2",
Rating = MediaRating.Poor,
Type = MediaType.Music,
Id = 2
};
listMedia.Add(testMedia2);
return listMedia;
}