gpt4 book ai didi

java - 在游戏框架中编写功能测试的正确方法

转载 作者:行者123 更新时间:2023-11-30 06:31:48 25 4
gpt4 key购买 nike

在为基于 play1.2.4 的 webapp 编写 FunctionalTest 时,我对如何正确编码感到有点困惑。困惑是关于涉及的事务边界。我在某处读到每个测试都有自己的事务。

在我的应用程序中,用户可以登录并将一些商品添加到购物车。然后他可以提供地址以便将商品发送给他。

我创建了如下私有(private)辅助方法

private Cart buyItemsAsCustomer(String email,String pass) {
User user = User.find("byEmail", email).first();
//login
Response loginResponse = loginAsUser(email,pass);
Cart cart = new Cart(user);
cart.save();
addItemsToCart(cart.id);
return cart;
}
private Response loginAsUser(String email,String password) {
Map<String,String> loginUserParams = new HashMap<String,String>();
loginUserParams.put("username", email);
loginUserParams.put("password", password);
Response response = POST("/login",loginUserParams);
return response;
}

private Response addItemsToCart(Long cartId) {
Cart cart = Cart.findById(cartId);
Item item = Item.find("byIsbn","978-0451160522").first();
Map<String,String> addtocartParams = new HashMap<String,String>();
addtocartParams.put("cartId", cart.id.toString());
addtocartParams.put("quantity", "2");
String addtocarturl = "/items/addtocart/"+item.id.toString();
Response response = POST(addtocarturl,addtocartParams);
cart.refresh();//without this the assertion about number of items in cart fails!
return response;
}

private Map<String,String> createAddressParams(){
Map<String,String> addressParams = new HashMap<String,String>();
addressParams.put("addressline1", "1123,xx street");
addressParams.put("state", "new york");
addressParams.put("country", "US");
return addressParams;
}

最后,我编写了 FunctionalTest,它调用这些辅助方法中的每一个来完成任务,然后进行断言

@Test
public void testCustomerCanAddAddress() {
Fixtures.loadModels("data.yml");
assertTrue(Address.findAll().size()==0);
Cart joncart = buyItemsAsCustomer("jon@gmail.com","jon");
assertFalse(jonart.cartItems.size()==0);
Map<String,String> addressParams = createAddressParams();
POST("/items/address/"+joncart.customer.getId().toString(),addressParams);
assertTrue(Address.findAll().size()==1);
}

运行它会产生一个

已捕获 java.lang.RuntimeException,java.util.concurrent.ExecutionException: play.exceptions.JavaExecutionException at

POST("/items/address/"+joncart.customer.getId().toString(),addressParams);

我认为这是由于某些事务边界问题而发生的,但我不确定..有人可以帮我纠正这个问题吗?..我真的很想知道在这种情况下应该如何编写测试..

我已经粘贴了堆栈跟踪 here

最佳答案

您的测试很奇怪,因为您混合了 http 调用和模型调用。功能测试纯粹是 http 调用。你测试你的 Controller 层

如果您需要一些模拟数据,您必须在另一个事务中创建它们,对我来说最简单的方法是以特定方法使用作业。如果您想检索数据以确保您的测试通过,也是一样。

@Before
public void cleanUp() throws Exception {
new Job() {
@Override
public void doJob() throws Exception {
Fixtures.deleteDatabase();
Fixtures.loadModels("data.yml");
}

}.now().get();
}

关于java - 在游戏框架中编写功能测试的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9510762/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com