[英]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.