我寫了一個功能測試來檢查添加項目到購物車。對於用戶能夠添加項目到購物車,他需要登錄。所以,我創建了一個方法登錄用戶和另一種方法來添加項目。在測試中的addtocart方法之前和之後,我正在檢查購物車內容的大小。當我以開發模式運行應用程序時,addtocart功能沒有任何問題(我可以檢查該數據庫也是 - 這是postgres,而不是在內存數據庫)。addtocart測試失敗。添加項目到購物車時,功能測試在playframework中失敗
這增加了項目到購物車
控制器方法public static void addItemToCart(Long productId,Long cartId,String quantity) {
Product product = Product.findById(productId);
ShopCart cart = ShopCart.findById(cartId);
int qty = Integer.parseInt(quantity);
CartItem cartItem = new CartItem(product,qty);
cart.addItem(cartItem);
cart.save();
System.out.println("Controller::addItemToCart()::cart id="+cart.id+" has="+cart.cartItems.size()+" items);
}
我的測試方法是
@Test
public void testUserCanAddItemsToCart() {
Fixtures.loadModels("data.yml");
User user = User.find("byEmail","[email protected]").first();
loginAsCustomer("[email protected]","userpass");
ShopCart usercart = new ShopCart(user);
usercart.save();
System.out.println("BEFORE ADD::usercart="+usercart.id+" has :"+usercart.cartItems.size()+" items");
assertTrue(usercart.cartItems.size()==0);
addItemsToCart(usercart);
System.out.println("AFTER ADD::usercart="+usercart.id+" has :"+usercart.cartItems.size()+" items");
assertFalse(usercart.cartItems.size()==0);//why does this fail?
}
private Response addItemsToCart(ShopCart cart) {
Product pdt = Product.find("byIsbn","654-0451160522").first();
assertNotNull(pdt);
System.out.println("addItemsToCart():BEFORE ADD cart="+cart.id+" has="+cart.cartItems.size());
Map<String,String> addtocartParams = new HashMap<String,String>();
addtocartParams.put("cartId", cart.id.toString());
addtocartParams.put("quantity", "2");
String addtocarturl = "/items/addtocart/"+pdt.id.toString();
Response response = POST(addtocarturl,addtocartParams);
System.out.println("addItemsToCart():AFTER ADD cart="+cart.id+" has="+cart.cartItems.size());
return response;
}
控制檯輸出我得到的是
BEFORE ADD::usercart=48 has :0 items
addItemsToCart():BEFORE ADD cart=48 has=0
Controller::addItemToCart()::cart id=48 has=1 items
addItemsToCart():AFTER ADD cart=48 has=0
AFTER ADD::usercart=48 has :0 items
這裏,在控制器的方法,購物車實例(id = 48)在保存到db後有1個項目。但在測試方法中,相同的購物車實例ID有0個內容。
我註釋掉了assertFalse方法,並使用cartId從db中檢索了購物車。然後,同一id的購物車有0個內容。我不明白爲什麼會發生這種情況。
//測試方法體..modified
ShopCart cart = ShopCart.findById(usercart.id);
System.out.println("AFTER ADD::cart="+cart.id+" has :"+cart.cartItems.size()+" items");
assertFalse(cart.cartItems.size()==0);//why does this fail?
好問題!這會從數據庫獲取數據的狀態,所以對其他情況可能非常有用。 – andronikus