Sorry guys, but today is my destructive
day...
I think most of the assert:whatever: methods are a waste of time
and energy and just pollute SUnit with lots of methods that are
named with misleading or at best debatable names.
Examples:
assert:equals:� it's just more typing than #= with no additional
outcome
assertCollection:hasSameElements:
So, let's start by asking what the question really means. Does it
mean that one collection is a subset of the other? What about
ordering then? Does it mean both contain the same elements at the
same position or just the fact that if they both were Sets
contained the exact same elements. The question itself is not
exact, so how could an answer possibly be?
Just a few weeks ago, we discussed something similar about the
equality of two Collections. Endless discussions where people try
convince others that their definition of equality and/or sameness
is correct with no outcome.
To me, something like assertCollection:hasSameElements: means
asking for trouble, because each and every definition of what that
may mean is debatable. It's unwanted syntactic sugar (actually
it's more like rat poison than sugar).
So what we really need to do is find ways for SUnit to formulate
exactly what we mean and use these as helpers in the execution of
a simple assert:. And that is not by adding new variants of
assert:
Adding more and more methods to TestAsserter only makes the
frustration with such problems increase and people hat SUnit more
and more.
So we need an extensible set of objects that, say, compare two
collections and return true or false. These can be used in an
assertion but also in domain code. We don't need more and more
variations of assert:
So we could start by providing an abstract superclass for
comparing collections based on more than just #= and #==. Then we
can add subclasses for that which have a real intention revealing
name like
CollectionHasExactlyTheSameElementsAsAnotherAtTheSamePosition.
Thinking about it, I even think that it really is a stupid idea.
Because chances are you need such a functionality in your domain
code anyways (you'd hardly need a test for it otherwise), so you
most likely implement the very same thing for exactly your
purposes in your project. And since we always write such a beast
with lots of tests, we have a reliable and debate-free way of what
we really want SUnit to test for if we use that object or method
in our tests in a simple assert:
All I am saying is: please keep these highly fragile and debatable
things out of SUnit. It will cause� debates and frustration rather
than improve people's opinion of SUNit and Unit testing. It is
counter-productive and will do harm of all kinds.
Don't mistake the fact that some static languages had to add lots
of assert: variations due to their static typing limitation with
an anticipation that this might be a good idea. It's not.
Okay, I told you this is my destructive day, so you may shoot now
;-)
Joachim
Am 24.10.15 um 22:14 schrieb Christophe Demarey:
Hi Peter,
Le 24 oct. 2015 � 20:36, Peter Uhn�k a �crit :
bump? :)
I introduced #assertCollection:hasSameElements: �for this
reason.
The problem with using sets is that I do not expect
that��#(1 1 2) has same elements as #(1 2)
This solution has my preference
yes, for me, it is a very basic assertion that should be
available as default.
Christophe
--
-----------------------------------------------------------------------
Objektfabrik Joachim Tuchel mailto:jtuchel@objektfabrik.de
Fliederweg 1� � � � � � � � � � � � �http://www.objektfabrik.de
D-71640 Ludwigsburg http://joachimtuchel.wordpress.com
Telefon: +49 7141 56 10 86 0� � � � �Fax: +49 7141 56 10 86 1