尝试运行XUnit测试时出错

时间:2019-07-08 22:40:50

标签: unit-testing asp.net-core xunit

我在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媒体

1 个答案:

答案 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;
    }