2017-07-17 8 views
0

コントローラを.netコアでテストしようとしましたが、時間が経っても修正できないエラーが発生しました。この問題は、コントローラへの転送によって疑似コンテキストで発生します。.netコアのコントローラのXUnitテストでエラーが発生しました。

コンテキストの例:テストの

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); 
    } 
} 

最初の2つのテストに合格したが、第3の試験は、ラインにエラーメッセージを与える:

TagController controller = new TagController(context.Object); 

メッセージ:Castle.DynamicProxy.InvalidProxyConstructorArguments例外 :クラス:interview.Models.Contextのプロキシをインスタンス化できません。 与えられた引数にマッチするコンストラクタが見つかりませんでした: Castle.Proxies.DbSet`1Proxy

答えて

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

は、コンテキストのコンストラクタはDbContextOptions<Context>を受け入れていますがDbSet<Tag>を渡します。一般的に

、パラメータなしのコンストラクタを追加したり、のようなものを渡す:

var builder = new DbContextOptionsBuilder<Context>(); 
var options = builder.Options; 
関連する問題