2017-08-02 19 views
8

Để truy cập các đối tượng, một DANH MẠNH có chứa các hàm trả về các hành động và đối tượng của một kiểu lưu trữ đã được tạo. Ví dụ:Giảm chi phí thử nghiệm khi DAO chứa hành động

def findByKeysAction(a: String, b: String, c: String = { 
    Users.filter(x => x.a === a && x.b === b && x.c === c).result 
} 

def findByKeys(a: String, b: String, c: String): Future[Option[foo]] = { 
    db.run(findByKeysAction(consumerId, contextId, userId)).map(_.headOption) 
} 

Lưu ý cách chức năng không dựa trên hành động kết thúc tốt hơn trong db.run().

Cách tiếp cận vững chắc để kiểm tra cả hai chức năng và giảm thiểu sự thừa mã là gì?

Tôi có thể kiểm tra cả hai với các thiết lập thử nghiệm riêng lẻ (trên đây là một ví dụ đơn giản; có thể có rất nhiều thiết lập thử nghiệm cần thiết để đáp ứng các hạn chế DB).

Trả lời

5

Lưu ý cách hàm không dựa trên hành động bao bọc hàm khác trong db.run().

Không thực sự. Phương pháp findByKeys của bạn không gọi findByUserIdAction, vì vậy, tôi đang điều chỉnh cho chi tiết nhỏ đó trong câu trả lời này.


def findByUserIdAction(userId: String) = { 
    Users.filter(_.userId === userId).result 
} 

Đoạn mã trên trả về một DBIOAction. Khi documentation trạng thái:

Cũng giống như một truy vấn, một I/O hành động chỉ là một mô tả của phẫu thuật. Tạo hoặc soạn các hành động không thực hiện bất cứ điều gì trên cơ sở dữ liệu.

Theo như người dùng của Slick được quan tâm, không có kiểm tra có ý nghĩa cho một DBIOAction, bởi vì bản thân nó không có gì; nó chỉ là một công thức cho những gì người ta muốn làm. Để thực hiện trên DBIOAction, bạn phải materialize nó, đó là những gì sau đây không:

def findByUserId(userId: String): Future[Option[User]] = { 
    db.run(findByUserIdAction(userId)).map(_.headOption) 
} 

Các thể hóa kết quả là những gì bạn muốn kiểm tra. Một cách để làm như vậy là sử dụng đặc điểm ScalaFutures của ScalaTest. Ví dụ, trong một spec pha trộn trong đặc điểm đó, bạn có thể có một cái gì đó như:

"Users" should "return a single user by id" in { 
    findByUserId("id3").futureValue shouldBe Option(User("id3", ...)) 
} 

Hãy xem Slick 3.2.0 test project này để biết thêm ví dụ: đặc biệt, TestSpecQueryCoffeesTest.

Tóm lại, đừng bận tâm khi thử cách ly DBIOAction; chỉ cần kiểm tra kết quả vật chất của nó.

+0

Ví dụ về mã của tôi đã sửa và xóa một số tiếng ồn. Xin lỗi vì sự bất tiện này, vui lòng cập nhật mã của bạn cho phù hợp nếu bạn có thời gian. Cảm ơn! –

Các vấn đề liên quan