franela/goblin

Add .Exists() to assertions

xetorthio opened this issue · 5 comments

So we can do:

  g.Assert(foo).Exists()

This should decide what to do for each type.

A question -- what exactly would this test? is it a non-null check?

I don't know that the Exists test makes sense for Go... Usually it means a check if variable exists at all in the current scope, correct? Pretty hard to get something like that past the Go compiler, unless there's some obvious case I'm overlooking

@t3hmrman we came up with two scenarios where this may be useful:

  1. Instead of doing g.Assert(err != nul).IsTrue() we can just use this new approach
  2. We can provide different implementation per type such as:

strings having >0 length
numbers being greater than 0
etc.

What do you think?

So I think the only place it makes sense is when dealing with pointers -- that's the only place it feels like to me that checking if something "exists" makes sense. You get a pointer to the thing, and you want to make sure that the thing is actually there (and not null/nil, the empty thing), then you check if it "exists".

If it were to take on only that meaning, it would be synonymous with a not-null check. But then again, if that were the case, then I would rather write something like g.Assert(err).IsNotNull() and get that easy readability...

I think a lot of the point of matchers is the readability they add, and that has a lot to do with the semantics of the statement. If you have something like g.Assert(str).Exists(), I don't think it would be as clear as something like g.Assert(len(str)).IsGreaterThanZero() or something like that. Matchers give us that declarative use, but I think you lose some of that for Exists on other types.

I am hung up on the english semantics of it -- exists just doesn't feel like something I would need to check in Go.

The functionality you're suggesting though would go great with just the general Assert function.

like if I could do g.Assert(x) by itself, and be assured that it had all those other implementations I could do stuff like:
g.Assert(strThatShouldNotBeEmpty)
g.Assert(numberThatShouldNotBeZero)
g.Assert(!err)

or something, but even that's a little cludgy, and not really declarative enough.

Maybe something like IsNil() or IsNotNil() ? I'm a little annoyed with the g.Assert(err != nil).IsTrue() pattern.

@ammario there's an opened PR actually for this but the author never got back. Would you like to push it forward? #49