The following is a Result class:
public class Result { public Result(T data) => Successful = (true, data); public Result(E data) => Error = (true, data); public (bool, T) Successful { get; } public (bool, E) Error { get; } }
Here’s a Service class:
public class Service { public Result MakeRequest(string name) { try { if (name == null) throw new Exception("Name is null"); } catch (Exception e) { return new Result(new ErrorDescription(e.Message)); } return new Result(new Dog(name)); } }
Here’s some tests:
[Test] public void service_is_successful() { // Setup var service = new Service(); // Test var result = service.MakeRequest("Kujo"); // Verify var ( success, _ ) = result.Successful; Assert.True(success); } [Test] public void service_thats_successful_doesnt_have_error() { // Setup var service = new Service(); // Test var result = service.MakeRequest("Kujo"); // Verify var (isError, _) = result.Error; Assert.False(isError); } [Test] public void service_fails() { // Setup var service = new Service(); // Test var result = service.MakeRequest(null); // Verify var (isError, _) = result.Error; Assert.True(isError); } [Test] public void service_that_failed_doesnt_have_success() { // Setup var service = new Service(); // Test var result = service.MakeRequest(null); // Verify var (isSuccess, _) = result.Successful; Assert.False(isSuccess); }