Unit test for allowable checkers moves
Is pattern matching within a unit test a code smell?


I don't think so. When a tested method returns a discriminated union, then using pattern matching in the unit test is natural.


  Do I really need to throw an exception just for my test to fail if the function under test receives invalid arguments (i.e. not Succeeded case value)?


Yes, I think you should. The reason for that is that if the function incorrectly returns something other than Succeeded, your test needs to fail. And throwing an exception is how you do that.



Also, if you're a fan of terseness, you can write the List.exists predicate as e.g. ((=) (0,4)), instead of using fun:

let northWestAvailable = coordinates |&gt; List.exists ((=) (0,4))


Or, even better, use should contain:

coordinates |&gt; should contain (0,4)


This is shorter, clearer and will also lead to clearer test failures.