2017-02-23 4 views
1

guideに続いてEntity FrameworkとMoqを使用して、自分のコンテキストをモックしてリポジトリをテストしようとしました。次のテストを使用してMoqモックセットからIQueryableを取得

public Customer GetSingle(int id, HotelBookingContext context = null, params Expression<Func<Customer, object>>[] navigationProperties) 
{ 
    using (var tempContext = context ?? new HotelBookingContext()) 
    { 
     IQueryable<Customer> dbQuery = tempContext.Set<Customer>(); 

     foreach (Expression<Func<Customer, object>> navigationProperty in navigationProperties) 
      dbQuery = dbQuery.Include(navigationProperty); 

     return dbQuery 
       .AsNoTracking() 
       .FirstOrDefault(x => x.Id == id); 
    } 
} 

::私は現在、私のリポジトリからの私のGetSingleクエリをテストする問題を抱えている

は、私は、コードをデバッグする場合

public void GetSingle_QueryingASingleCustomer_ReturnsASingleCustomer() 
{ 
    var cus = new Customer() { Email = "testMail", Name = "testName", Id = 1 }; 
    var customer = new List<Customer> {cus}.AsQueryable(); 

    var mockSet = new Mock<DbSet<Customer>>(); 
    mockSet.As<IQueryable<Customer>>().Setup(m => m.Provider).Returns(customer.Provider); 
    mockSet.As<IQueryable<Customer>>().Setup(m => m.Expression).Returns(customer.Expression); 
    mockSet.As<IQueryable<Customer>>().Setup(m => m.ElementType).Returns(customer.ElementType); 
    mockSet.As<IQueryable<Customer>>().Setup(m => m.GetEnumerator()).Returns(customer.GetEnumerator()); 

    var mockContext = new Mock<HotelBookingContext>(); 
    mockContext.Setup(m => m.Customers).Returns(mockSet.Object); 

    var temp = _customerRepository.GetSingle(cus.Id, mockContext.Object); 
    Assert.AreEqual(temp.Name, cus.Name); 
    Assert.AreEqual(temp.Email, cus.Email); 
    Assert.AreEqual(temp.Id, cus.Id); 
} 

は私が気付いているGetSingle機能でIQueryableと呼ばれるdbQuerynullのままであるため、return文では使用できません。

これはなぜですか?

しかし、実際のコンテキストで実行するとうまく動作します。

+0

セットアップで '.Customers'プロパティを設定し、' .Set () '関数を設定していないからです。 Moqは現在の設定に基づいて何をすべきかについて何の手がかりも持っていません。 – Nkosi

答えて

1

セットアップでは、.Set<Customer>()機能ではなく、模擬されたコンテキストで.Customersプロパティを設定するためです。 Moqは現在の設定に基づいて何をすべきかについて何の手がかりも持っていません。

mockContext.Setup(m => m.Set<Customer>()).Returns(mockSet.Object); 

上記の設定は、現在の形式でテスト対象のメソッドの予想される動作と一致するはずです。

賢明その他

これはセットアップ...

mockContext.Setup(m => m.Customers).Returns(mockSet.Object); 

であれば...あなたはとして行使するための試験のために

IQueryable<Customer> dbQuery = tempContext.Customers; 

...被試験方法を更新する必要があります期待される。

関連する問題