2016-03-19 16 views
2

私はジェネリックリポジトリのdbsetのwhere節をモックしようとしています。なぜSystem.NotSupported Exceptionを取得しているのかわかりません。 私はまったく新しいことを嘲笑しているので、なぜこれが起こっているのかわかりません。模擬dbset <T>ここでメソッドはnotSupportedExceptionを返します

private List<StubEntity> _data; 
private Repository<StubEntity> _repository; 

[TestInitialize] 
public void TestInitialize() 
{ 
    _data = new List<StubEntity> 
    { 
     new StubEntity {Id = 1, Name = "Entity 1"}, 
     ... 
    }; 
    var queryableData = _data.AsQueryable(); 

    var mockDbSet = new Mock<DbSet<StubEntity>>(); 
    mockDbSet 
     .Setup(m => m.Where(It.IsAny<Expression<Func<StubEntity, bool>>>())) 
     .Returns<Expression<Func<StubEntity, bool>>>(p => queryableData.Where(p)); 

    var context = new Mock<StubContext>(); 
    context.Setup(x => x.DbEntities).Returns(mockDbSet.Object); 
    context.Setup(x => x.Set<StubEntity>()).Returns(mockDbSet.Object); 

    _repository = new Repository<StubEntity>(context.Object); 
} 

私は唯一のテストFindメソッドは、単にコンテキストのWHERE句を呼び出す

[TestMethod] 
public void Find_ReturnsProperEntity() 
{ 
    var entity = _repository.Find(s => s.Id == 1); 
    .... 
} 

にwhere句をテストしています。

public IEnumerable<TEntity> Find(Expression<Func<TEntity, bool>> predicate) 
{ 
    return Context.Set<TEntity>().Where(predicate); 
} 
+0

この回答をお持ちですか? http://stackoverflow.com/questions/25960192/mocking-ef-dbcontext-with-moq – cecilphillip

答えて

0

部品番号はnon-virtualメンバー(メソッド/プロパティ)の問題があり、それらが遭遇したときに例外がスローされます。

例えば:

System.NotSupportedException:X => x.DbEntities:System.NotSupportedException:非仮想(VBでオーバーライド)メンバーに無効 セットアップ。

それは仮想プロパティなどで編集する必要がある場合、ここでの仮定が... ...あなたのStubContextは次のようになりますことを

public class StubContext : DbContext { 
    //...code removed for brevity 

    public DbSet<StubEntity> DbEntities { get; set; } 

    //...other code removed for brevity 
} 

です...

public class StubContext : DbContext { 
    //...code removed for brevity 

    public virtual DbSet<StubEntity> DbEntities { get; set; } 

    //...other code removed for brevity 
} 

以下のユーティリティクラスの使用

using Moq; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 

public static class MockDbSet { 
    public static Mock<DbSet<T>> Create<T>(params T[] elements) where T : class { 
     return elements.AsDbSetMock(); 
    } 
} 

public static class MockDbSetExtensions { 
    public static Mock<DbSet<T>> AsDbSetMock<T>(this IEnumerable<T> list) where T : class { 
     IQueryable<T> queryableList = list.AsQueryable(); 
     Mock<DbSet<T>> dbSetMock = new Mock<DbSet<T>>(); 
     dbSetMock.As<IQueryable<T>>().Setup(x => x.Provider).Returns(queryableList.Provider); 
     dbSetMock.As<IQueryable<T>>().Setup(x => x.Expression).Returns(queryableList.Expression); 
     dbSetMock.As<IQueryable<T>>().Setup(x => x.ElementType).Returns(queryableList.ElementType); 
     dbSetMock.As<IQueryable<T>>().Setup(x => x.GetEnumerator()).Returns(() => queryableList.GetEnumerator()); 
     return dbSetMock; 
    } 
} 

私は...嘲笑DbSetと修正案で

[TestClass] 
public class MockDbSetTests { 
    private List<StubEntity> _data; 
    private Repository<StubEntity> _repository; 

    [TestInitialize] 
    public void TestInitialize() { 
     _data = new List<StubEntity> 
     { 
      new StubEntity {Id = 1, Name = "Entity 1"}, 
      //... 
     }; 

     var mockDbSet = _data.AsDbSetMock(); 

     var context = new Mock<StubContext>(); 
     context.Setup(x => x.DbEntities).Returns(mockDbSet.Object); 
     context.Setup(x => x.Set<StubEntity>()).Returns(mockDbSet.Object); 

     _repository = new Repository<StubEntity>(context.Object); 
    } 

    [TestMethod] 
    public void Find_Should_Return_Proper_Entity() { 
     //Act 
     var entity = _repository.Find(s => s.Id == 1); 
     //Assert 
     Assert.IsNotNull(entity); 
     Assert.IsTrue(entity.Count() == 1); 
    } 
} 

をあなたのユニットテストを再現し...、それは(GREEN)を通過しました。

関連する問題