繁体   English   中英

.net Core中控制器的XUnit测试时间错误

[英]Error in time XUnit testing of the controller in .net Core

我尝试在.net Core中测试控制器,但随着时间的推移,测试会出现我无法纠正的错误。 通过将模拟环境传输到控制器,会产生问题。

上下文示例:

public class Context : DbContext
{
    public virtual DbSet<Exercise> ExerciseSet { get; set; }
    public virtual DbSet<Tag> TagSet { get; set; }
    public virtual DbSet<Type> TypeSet { get; set; }
    public virtual DbSet<Difficulty> DifficultySet { get; set; }
    public virtual DbSet<ExerciseTag> ExerciseTagSet { get; set; }
    public virtual DbSet<Mark> MarkSet { get; set; }
    public virtual DbSet<ExerciseMark> ExerciseMarkSet { get; set; }

    public Context(DbContextOptions<Context> options)
        : base(options)
    {
    }
}

测试示例:

public class TagControllerTest
{
    [Fact]
    public void SimpleTest()
    {
        Assert.Equal(5, 5);
    }

    [Fact]
    public void SimpleTest2()
    {
        Assert.Equal(5, 5);
    }

    [Fact]
    public void ControllerGetTest()
    {
        //Arrange
        var data = new List<Tag>
        {
            public virtual DbSet<Exercise> ExerciseSet { get; set; }
            public virtual DbSet<Tag> TagSet { get; set; }
            public virtual DbSet<Type> TypeSet { get; set; }
            public virtual DbSet<Difficulty> DifficultySet { get; set; }
            public virtual DbSet<ExerciseTag> ExerciseTagSet { get; set; }
            public virtual DbSet<Mark> MarkSet { get; set; }
            public virtual DbSet<ExerciseMark> ExerciseMarkSet { get; set; }
       }.AsQueryable();

        Mock<DbSet<Tag>> dbSetMock = new Mock<DbSet<Tag>>();
        dbSetMock.As<IQueryable<Tag>>().Setup(m => m.Provider).Returns(data.Provider);
        dbSetMock.As<IQueryable<Tag>>().Setup(m => m.Expression).Returns(data.Expression);
        dbSetMock.As<IQueryable<Tag>>().Setup(m => m.ElementType).Returns(data.ElementType);
        dbSetMock.As<IQueryable<Tag>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());

        Mock<Context> context = new Mock<Context>(dbSetMock.Object);
        context.Setup(x => x.TagSet).Returns(dbSetMock.Object);

        TagController controller = new TagController(context.Object);

        // Act
        var result = controller.GetTag();

        // Assert
        Assert.NotNull(result);
    }
}

前两个测试通过,但第三个测试在行中给出了错误消息:

TagController controller = new TagController(context.Object);

消息:Castle.DynamicProxy.InvalidProxyConstructorArgumentsException:无法实例化类的采访:Models.Context。 找不到与给定参数匹配的构造方法:Castle.Proxies.DbSet`1Proxy

Mock<Context> context = new Mock<Context>(dbSetMock.Object);

上下文的构造函数接受DbContextOptions<Context>但是您传递DbSet<Tag>

通常,添加无参数构造函数或传递如下内容:

var builder = new DbContextOptionsBuilder<Context>();
var options = builder.Options;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM