1. C# / Говнокод #13561

    +141

    1. 1
    2. 2
    3. 3
    bool eventWasRaised = false;
    
    eventWasRaised.Should().Be.False();

    иногда удивляет до чего доходят .NET unit testing фреймворки.
    пруф http://joseoncode.com/2010/04/29/event-aggregator-with-reactive-extensions/
    эту конструкцию глядишь и эксепшеном вырвет если не false.

    Запостил: Irdis, 07 Августа 2013

    Комментарии (24) RSS

    • До чего дошел прогресс
      Это же синтаксический кал.

      Так и просится
      int Int = 5;
      Int.Must().Be(IntConst.Five).MotherFucke r();
      Ответить
      • >синтаксический кал
        LINQ-мышление. fluent-интерфейс ломает не только семьи.
        Ответить
    • Закулисье выглядит как-то так, я ведь прав?

      namespace ConsoleApplication27
      {
          class Program
          {
              static void Main(string[] args)
              {
                  bool eventWasRaised = false;
                  eventWasRaised.Should().Be.False();
              }
          }
      
          static class BoolExtention
          {
              public static CrazyClass Should(this bool someBool)
              {
                  return new CrazyClass();
              }
          }
      
          class CrazyClass
          {
              public AnotherCrazyClass Be;
          }
      
          class AnotherCrazyClass
          {
              public void False()
              {
                //100% false!
              }
          }
      }
      Ответить
      • Скорее, все методы принадлежат одному классу, и каждый вызов меняет внутреннее состояние и возвращает this. Конечный автомат, по сути. Например, для состояния "после вызова Be()" допустимы только вызовы, задающие значения.
        Тогда можно будет написать .Should().Be().False() но нельзя .Should().Be().Should()
        Хотя в твоем примере такая конструкция отсеется еще на этапе компиляции.
        Ответить
        • Should().Be.Or().Not().Should().Be
          Ответить
        • А так вообще делать... ээээ по божески?
          Ответить
          • Я в том смысле, что наличие таких конструкций в большенстве случаев будет обусловлено плохой прораборной интервейса, и будет создавать видимость класса-матрешки.

            В некоторых случаях, это, конечно, добавляет гибкости. Например когда порядок вызова методов будет постоянно изменяться, но я бы не стал часто этим пользоваться.

            Опытные люди, скажите, прав ли я? Я то только студент)
            Ответить
        • Можно ещё сделать несколько интерфейсов, реализовать их все одним билдером, и при вызове методов возвращать "проекцию" this (осторожно, жаба)
          public interface Boolable {
              public void true_();
              public void false_();
          }
          
          public interface Beable {
              public Boolable be();
          }
          public interface Shouldable {
              public Beable should();
          }
          
          public class Builder implements Boolable, Beable, Shouldable {
              private boolean expr;
          
              private Builder(boolean expr) {
                  this.expr = expr;
              }
          
              public void true_() {
                  if (!expr) throw new RuntimeException();
              }
          
              public void false_() {
                  if (expr) throw new RuntimeException();
              }
          
              public Boolable be() {
                  return this;
              }
          
              public Shouldable should() {
                  return this;
              }
          
              public static Shouldable on(boolean expr) {
                  return new Builder(expr);
              }
          
              public static void main(String...) {
                  Builder.on(false).should().be().false_();
              }
          }
          Ответить
          • >осторожно, жаба
            Этот пиздец без IDE смотреть невозможно.
            Ответить
          • Жаба это не хаскел)
            Ответить
            • should a b | a == b = ()
                         | otherwise = error $ "Expected " ++ show b ++ ", got " ++ show a
              be = id
              
              test1 = let eventWasRaised = False in 
                  eventWasRaised `should` be False
              Ответить
              • : place
                    ( cs ds -- )
                    2dup >r >r char+ swap chars cmove r> r> c!
                ; 
                
                : append
                    ( cs ds -- )
                    2dup dup c@ tuck >r >r swap >r    
                    char+ swap chars swap chars cmove 
                    r> r> swap r> + swap c!
                ;
                
                : fmt
                    ( n ds -- )
                    >r dup >r abs s>d
                    <# space #s r> sign #>
                    r@ dup c@ dup >r chars + char+ swap dup
                    >r cmove r> r> + r> c!
                ;
                
                : be
                    ( c ds -- )
                    0= if dup c@ >r char+ r> exception throw then
                ;
                
                1 constant event-was-raised
                
                create error-message 256 allot
                
                : should
                    ( v e -- )
                    2dup >r >r
                    s" Expected: " error-message place
                    error-message fmt
                    s\" \040Received: " error-message append
                    error-message fmt
                    error-message r> r> =
                ;
                
                \ test case:
                false event-was-raised should be

                Where is your god now?
                Ответить
                • > false event-was-raised should be
                  The mistery of Yoda’s speech uncovered is:
                  Just an old Forth programmer Yoda was.
                  Ответить
                • Отличный говнокод, достойный этого сайта! Стековые комменты забагованы - в них не описаны выходные аргументы. В самих словах творится треш угар и содомия с джвумя стеками... В be перекошен стек, если event-was-raised все-таки false.

                  Давненько не брал я в руки шашек: http://ideone.com/nXZNM3.
                  Ответить
                  • Переписывал в последнюю минуту, сначала комментарии были правильными. Про place+ не знал... Но говнокод был написан в учебных целях.
                    Ответить
          • Получается хитрая замена ветвлению
            Ответить
    • У.Меня().От.Синтаксического(Сахара).Слиплось();
      Ответить
      • Прошу прощения за оффтоп, но я не удержался.
        Boolean.prototype.Меня = function(){
          var that = this, o;
          return ((o = {}).От = {}).Синтаксического = function(x){
            if(x !== Сахара) return;
            return (o = {}).Слиплось = function(){
              console.log(that.valueOf() ? 'Бывает.' : 'Не бывает.');
            }, o;
          }, o;
        };
          
        var Сахара = 42, У = new Boolean(false);
        У.Меня().От.Синтаксического(Сахара).Слиплось();
        Ответить
    • Зависть к рубистам с их rspec-ом? :)
      Ответить
      • по всей видимости, да.
        никогда не понимал, зачем излишне англицизировать выражения? все эти should be
        почему бы не писать проще, assert*ами?
        Ответить
        • Я так понимаю там типа DSL используется. В руби он достаточно неплохой. Для юнит тестирования немного громоздко, но зато понятно всегда.
          Тут как бы тоже видна попытка создания DSL, но очень убогая.
          Ответить
    • "иногда удивляет до чего доходят .NET unit testing фреймворки."

      в такие моменты у меня только одна реакция - Quis custodiet ipsos custodes? - кто тестирует тестовые фреймворки?
      Ответить
    • Нормальный синтаксис, отделяющий сами тестируемые действия от проверок.
      Ответить
      • А что не так? За что сливаете карму?
        Плохо, когда тестируемый код не отличается от проверок. Плохо, когда проверяемое спрятано в Assert.AreEqual(x, y) и неоличимо от образца, с которым оно сравнивается.
        А так - на первом месте стоит значение, которое проверяем. А затем написано не КАК проверять, а ЧТО ожидается.
        Кроме того, использовать сахар в работе не так затратно, как самому его придумывать.

        Единственный минус - в проекте еще одна необязательная библиотека.
        Ответить

    Добавить комментарий