Как реализовать чистый базовый тестовый класс с помощью общих методов Assert (F #) - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь создать базовый тестовый класс, в котором я могу настроить общие методы.

type BaseTest() =

    member self.Assert (functionToEvaluate:bool, ?errorMessage:string) =    
        let a = fun () -> defaultArg errorMessage ""    
        match errorMessage with
        | None -> NUnit.Framework.Assert.That(functionToEvaluate)
        | _ -> NUnit.Framework.Assert.That(functionToEvaluate, a )

[<TestFixture>]
type MyTest () =
    inherit BaseTest()

    [<Test>]
    member self.``test something``() =
        let x = 1
        self.Assert_( (x = 2))
        // or 
        self.Assert_( (x = 2), "x value is not 2")
  1. Как сделать код "чистым" (let a ... ужасен для меня)
  2. Как избежать использования this / self в производном классе?
  3. Как я могу написать это как self.Assert(x=1) или даже лучше просто Assert(x=1) вместо self.Assert((x=1))?

То, что я хочу сделать (и я могу сделать с C #), это:

// in base test class
protected void Assert(bool test) => NUnit.Framework.Assert.That(test);
protected void Assert(bool test, string errorMessage) => NUnit.Framework.Assert.That(test, errorMessage);

// in test class
public void TestSomething() {
     var x = 1
     Assert(x==2)
     // or
     Assert(x==2, "x is not 2")
}

1 Ответ

0 голосов
/ 09 декабря 2018

Ваша проблема в том, что вы пытаетесь перевести программу C # на дословно F # и ожидаете, что она будет выглядеть «красиво», не понимая, что исходная программа C # уже полна специфических для C # трюков, которые существуют, чтобы она выглядела"отлично".Одним из примеров является базовый класс.Почему существует базовый класс?Это что-то представляет?Нет, это не так: это делается с единственной целью - избегать имени класса при вызове этих функций - т.е. вы пишете Assert вместо SomeHelper.Assert.Это связано с тем, что в C # у вас не может быть автономных функций.

Но в F # вы можете!

let assrt x = NUnit.Framework.Assert.That(x)
let assrtWith x msg = NUnit.Framework.Assert.That(x, msg)

[<TestFixture>]
type SaleRepositoryTest () =

    [<Test>]
    member self.``test something``() =
        let x = 1
        assrt (x=2)
        assrtWith (x=2) "x is not 2"

(Обратите внимание, что вы не можете использоватьname assert, потому что это ключевое слово)

Также обратите внимание, что обычно классы не нужны .Тот факт, что в C # вы ничего не можете сделать без них, является гигантской ошибкой, которая проистекает из Java-дизайна, что было неправильным пониманием ОО.

Вы можете иметь отдельно стоящие функции.Если я правильно помню, NUnit должен уметь обнаруживать такие тесты очень хорошо (хотя я не могу проверить прямо сейчас):

let [<Test>] ``test something``() =
    let x = 1
    assrt (x=2)
    assrtWith (x=2) "x is not 2"

Наконец, я настоятельно рекомендую вам рассмотреть FsUnit.Он может связываться с NUnit (если вы заблокированы) и предоставляет хорошую библиотеку F # -идиоматических утверждений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...