2015-05-24 4 views
1

Я пытаюсь написать простой hunit-test, чтобы проверить, как создается функция Text.XML.Light.Element из функции.Сравнение для Text.XML.Light.Element в тесте

Функция:

createElement :: String -> String -> XML.Element 
createElement tg txt = 
blank_element{ elName = qualName tg 
      , elContent = [ Text blank_cdata { cdData = txt } ] 
      } 

и мой тест просто:

import Test.Framework (defaultMain) 
import Test.Framework.Providers.HUnit (testCase) 
import Test.HUnit (Assertion, assertEqual) 
import Text.XML.Light as XML 
import MyModule.MyCode (createElement) 

testCreateElement :: Assertion 
testCreateElement = do 
    let tg = "item" 
    let txt = "example of text" 
    let expectedElement = XML.Element { 
          elName = XML.QName{ qName = tg, qURI = Nothing, qPrefix = Nothing } 
          , elAttribs = [] :: [ Attr ] 
          , elContent = [ fromString txt ] :: [ Content ] 
          , elLine = Nothing 
          } 
    assertEqual "create an element" expectedElement (createElement tg txt) 

-- utils 

fromString :: String -> Content 
fromString txt = Text blank_cdata { cdData = txt } 

Что я получаю эту ошибку:

No instance for (Eq Element) arising from a use of ‘assertEqual’ 
    In a stmt of a 'do' block: 
     assertEqual "create an element" expectedElement (xmlElement tg txt) 
    In the expression:.... 

Я проверил в исходном коде Text.XML.Light, и похоже, что нет Eq экземпляра, определенного для Element. Как я могу выполнить тестовую работу?

ответ

0

Вы можете избежать случаев бесхозных, написав свой собственный предикат равенства:

equalElement :: XML.Element -> XML.Element -> Bool 
equalElement = ... 

, а затем использовать его с помощью assertBool вместо assertEqual:

assertBool "create an element" $ equalElement expectedElement (createElement tg txt)