2014-01-21 51 views
2

根據Play's documentation的(MVC)模式應該是這樣的:播放框架模型單元測試

object MyModel { 
    //code 
} 

你怎麼單元測試嗎?在Play's unit testing documentation中,示例模型不再定義爲對象,而是定義爲類。我已經構建了我的應用程序將對象聲明爲模型,這是否意味着我現在必須更改它?

這是如何對控制器對象進行單元測試的示例。這:

object MyController extends Controller { 
} 

要改變成這樣:

trait MyController { 
    //code 
} 

object MyController extends Controller with MyController 

,以便它是單元測試,在這種情況下,單元測試將是這個樣子:

object MyControllerSpec extends PlaySpecification with Results { 

    class TestController() extends Controller with MyController 

    //unit test code 

} 

我必須/可以使用相同的技術來測試我的模型(物體)嗎?如果是的話那麼如何?如果沒有,那麼唯一的方法是將所有模型作爲類而不是對象?

播放框架2.2.1

回答

1

如果你想測試的對象和他們自己決定什麼他們的依賴,以及如何與他們交談,只有這樣會以某種方式替代那些依賴關係,這些對象,以便例如用數據庫訪問,它可能會提供一個不同的配置來運行另一個數據庫,這將要求您確保該數據庫在測試運行之間保持清潔,並且不會在測試用例之間泄漏數據。另一個問題是它可能會讓你的測試運行緩慢。

如果您希望運行僅測試一個特定代碼段的單元測試,那麼您可以如何使用依賴注入來做到這一點。簡單depencency注射的一個例子是(aboutish你與你的控制器描述了):

class EntityDAO(db: SomeWayToTalkToADB) { 
    ... defs using db ... 
} 

object EntityDao extends EntityDAO(Somwehere.concreteDBaccess) 

然後在測試:

"My entity dao" should { 

    "do stuff with the db" in { 
    val dao = new EntityDao(somefakeDB) 
    dao.doStuff mustEqual something 
    } 
} 

這種方式,你可以很容易地提供一個假的實現,一個模擬用例如mockito等創建。

其他選項可能是提供第二個參數列表中的實際數據庫訪問對象到每個需要它的方法,可能是隱含的,以避免重複自己。你也可以使用蛋糕模式,一些DI庫或可能的monad,這取決於你想要進入功能性的東西有多深。

+0

請注意,如果您的控制器沒有任何依賴關係,它會調用您不必將其分解爲特徵和對象,但可以直接調用該對象。 – johanandren