2017-11-17 8 views
0

私はテストとMockを書くことでは新しいです。私は、Raw SQLを使ってデータを取得する方法を理解しようとしています。ここで私が持っているものです。SqlQueryを模擬する方法

私はDataContext.cs

public class DataContext : DbContext 
{ 
    public DataContext() 
     : base("Main") 
    { 
    } 

    public virtual DbSet<DbBook> Books { get; set; } 
    public virtual DbSet<DbMovie> Movies { get; set; } 
} 

私が持っているコントローラBooksController.cs

public class BooksController : ApiController 
{ 
    private readonly BookDataContext _db; 
    public BooksController() 
    { 
     _db = new BookDataContext(); 
    } 

    public BooksController (BookDataContext context) 
    { 
     _db = context; 
    } 

    [HttpGet] 
    [Route("books")] 
    public Book GetBooks() 
    { 
     using (var dbContextTransaction = _db.Database.BeginTransaction()) 
     { 
      var test = _db.Books.SqlQuery("select * from BOOK"); 
      var test2 = from b in _db.Books 
          orderby b.Books 
          select b; 
     } 
    } 
} 

ていると私はテストに

[TestMethod] 
public void GetBook() 
{ 
    var data = new List<DbBook> 
    { 
     new DbBook{ Book = "Book1"}, 
     new DbBook{ Book = "Book2"} 
    }.AsQueryable(); 

    var mockSet = new Mock<DbSet<DbScriptId>>(); 
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.Provider).Returns(data.Provider); 
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.Expression).Returns(data.Expression); 
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.ElementType).Returns(data.ElementType); 
    mockSet.As<IQueryable<DbBook>>().Setup(m => 
    m.GetEnumerator()).Returns(data.GetEnumerator()); 
    mockSet.Setup(m => m.Find(It.IsAny<object[]>())) 
     .Returns<object[]>(sc => data.SingleOrDefault()); 


    var mockContext = new Mock<DataContext>(); 
    mockContext.Setup(c => c.Books).Returns(mockSet.Object); 

    var controller = new BooksController (mockContext.Object); 
    var books = controller.GetBook(); 
} 

私が使用してデータを取得することができますがありますLinq(test2)がSqlQueryを使用すると、常にnull(テスト)になります。 SqlQueryを使用してそれを変更する方法Linqを使用するのと同じ結果が得られますか?また、InMemoryデータベースを作成すると、実際にはデータベースではなく、バックグラウンドでいくつかのリスト(タイプ= IQueriable)が作成されることが分かります。この問題の説明と解決方法を教えてください。

+0

あなたは何を嘲笑していますか?生のSQLはすべての依存関係の注入を取り除き、何もあなたを黙らせません。あなたは何を試そうとしていますか? – lloyd

+0

コードを編集する必要があります。 GetBooks()メソッドからいくつかの結果が得られたかどうかをテストしたいだけです。私はテストをデバッグするときにGetBooks()メソッドにジャンプし、 "test"変数がnullになる一方、 "test2"は必要なデータを取得します。さて、生のSQLステートメントをテストするには? – Rok

答えて

2

これはどうですか? (あなたの質問が正しいかどうか分かりません)

var queryMock = new Mock<DbSqlQuery<DbBook>>(); 
queryMock.Setup(x => x.GetEnumerator()).Returns(data.GetEnumerator()); 

mockSet.Setup(m => m.SqlQuery(It.IsAny<string>(), It.IsAny<object[]>())).Returns(queryMock.Object); 

この例では、すべてのクエリがすべてのアイテムを返すと仮定しています。

+0

私は試して見栄えが良いですが、 "test"はオブジェクトを返しますが、結果ビューは "test2"(Linq)が正常に実行している間は "Enumeration結果が返されません"を返します。しかし、それは一歩前進だ、私はちょうどこのことを行うためにいくつかの余分な知識が必要だと思う。ありがとう – Rok