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
と呼ばれるdbQuery
はnull
のままであるため、return文では使用できません。
これはなぜですか?
しかし、実際のコンテキストで実行するとうまく動作します。
セットアップで '.Customers'プロパティを設定し、' .Set() '関数を設定していないからです。 Moqは現在の設定に基づいて何をすべきかについて何の手がかりも持っていません。 –
Nkosi