/Source/NSubstitute.Acceptance.Specs/ReturningResults.cs

http://github.com/nsubstitute/NSubstitute · C# · 227 lines · 185 code · 40 blank · 2 comment · 6 complexity · 19dd374fb9259e061dd8cecf8f155fb9 MD5 · raw file

  1. using System;
  2. #if (NET4 || NET45 || NETSTANDARD1_5)
  3. using System.Threading.Tasks;
  4. #endif
  5. using NSubstitute.Acceptance.Specs.Infrastructure;
  6. using NSubstitute.Exceptions;
  7. using NSubstitute.ReturnsExtensions;
  8. using NUnit.Framework;
  9. namespace NSubstitute.Acceptance.Specs
  10. {
  11. [TestFixture]
  12. public class ReturningResults
  13. {
  14. private ISomething _something;
  15. [Test]
  16. public void Return_a_single_result()
  17. {
  18. _something.Count().Returns(3);
  19. Assert.That(_something.Count(), Is.EqualTo(3), "First return");
  20. Assert.That(_something.Count(), Is.EqualTo(3), "Second return");
  21. }
  22. [Test]
  23. public void Return_multiple_results_from_different_calls()
  24. {
  25. _something.Echo(1).Returns("one");
  26. _something.Echo(2).Returns("two");
  27. Assert.That(_something.Echo(1), Is.EqualTo("one"), "First return");
  28. Assert.That(_something.Echo(2), Is.EqualTo("two"), "Second return");
  29. }
  30. [Test]
  31. public void Return_multiple_results_from_the_same_call()
  32. {
  33. _something.Count().Returns(1, 2, 3);
  34. Assert.That(_something.Count(), Is.EqualTo(1), "First return");
  35. Assert.That(_something.Count(), Is.EqualTo(2), "Second return");
  36. Assert.That(_something.Count(), Is.EqualTo(3), "Third return");
  37. Assert.That(_something.Count(), Is.EqualTo(3), "Fourth return");
  38. }
  39. [Test]
  40. public void Return_multiple_results_from_funcs()
  41. {
  42. _something.Count().Returns(
  43. _ => 1,
  44. _ => 2,
  45. _ => 3);
  46. Assert.That(_something.Count(), Is.EqualTo(1), "First return");
  47. Assert.That(_something.Count(), Is.EqualTo(2), "Second return");
  48. Assert.That(_something.Count(), Is.EqualTo(3), "Third return");
  49. Assert.That(_something.Count(), Is.EqualTo(3), "Fourth return");
  50. }
  51. [Test]
  52. public void Return_multiple_results_from_funcs_throws_exception()
  53. {
  54. _something.Count().Returns(
  55. _ => 1,
  56. _ => { throw new Exception("Count() execution failed."); },
  57. _ => 3);
  58. Assert.That(_something.Count(), Is.EqualTo(1), "First return");
  59. Assert.Throws<Exception>(() => this._something.Count());
  60. Assert.That(_something.Count(), Is.EqualTo(3), "Third return");
  61. }
  62. [Test]
  63. public void Return_multiple_results_from_funcs_for_any_arguments()
  64. {
  65. _something.Echo(1).ReturnsForAnyArgs(_ => "first", _ => "second");
  66. Assert.That(_something.Echo(2), Is.EqualTo("first"));
  67. Assert.That(_something.Echo(724), Is.EqualTo("second"));
  68. }
  69. [Test]
  70. public void Return_result_for_any_arguments()
  71. {
  72. _something.Echo(1).ReturnsForAnyArgs("always");
  73. Assert.That(_something.Echo(1), Is.EqualTo("always"));
  74. Assert.That(_something.Echo(2), Is.EqualTo("always"));
  75. Assert.That(_something.Echo(724), Is.EqualTo("always"));
  76. }
  77. [Test]
  78. public void Return_multiple_results_for_any_arguments()
  79. {
  80. _something.Echo(1).ReturnsForAnyArgs("first", "second");
  81. Assert.That(_something.Echo(2), Is.EqualTo("first"));
  82. Assert.That(_something.Echo(724), Is.EqualTo("second"));
  83. }
  84. #if (NET4 || NET45 || NETSTANDARD1_5)
  85. [Test]
  86. public void Return_result_for_any_arguments_async()
  87. {
  88. _something.EchoAsync(1).ReturnsForAnyArgs("always");
  89. Assert.That(_something.EchoAsync(1).Result, Is.EqualTo("always"));
  90. Assert.That(_something.EchoAsync(2).Result, Is.EqualTo("always"));
  91. Assert.That(_something.EchoAsync(724).Result, Is.EqualTo("always"));
  92. }
  93. [Test]
  94. public void Return_multiple_results_for_any_arguments_async()
  95. {
  96. _something.EchoAsync(1).ReturnsForAnyArgs("first", "second");
  97. Assert.That(_something.EchoAsync(2).Result, Is.EqualTo("first"));
  98. Assert.That(_something.EchoAsync(724).Result, Is.EqualTo("second"));
  99. }
  100. [Test]
  101. public void Return_multiple_results_from_funcs_for_any_arguments_async()
  102. {
  103. _something.EchoAsync(1).ReturnsForAnyArgs(_ => "first", _ => "second");
  104. Assert.That(_something.EchoAsync(2).Result, Is.EqualTo("first"));
  105. Assert.That(_something.EchoAsync(724).Result, Is.EqualTo("second"));
  106. }
  107. #endif
  108. [Test]
  109. public void Return_calculated_results_for_any_arguments()
  110. {
  111. _something.Echo(-2).ReturnsForAnyArgs(x => x[0].ToString());
  112. Assert.That(_something.Echo(12), Is.EqualTo(12.ToString()));
  113. Assert.That(_something.Echo(123), Is.EqualTo(123.ToString()));
  114. }
  115. [Test]
  116. [Pending, Explicit]
  117. public void Return_specific_value_for_tostring()
  118. {
  119. _something.ToString().Returns("this string");
  120. Assert.That(_something.ToString(), Is.EqualTo("this string"));
  121. }
  122. [Test]
  123. public void Throw_when_blatantly_misusing_returns()
  124. {
  125. const string expectedMessagePrefix = "Could not find a call to return from.";
  126. var exception = Assert.Throws<CouldNotSetReturnDueToNoLastCallException>(() =>
  127. {
  128. //Start with legitimate call to Returns (so the static context will not have any residual calls stored).
  129. _something.Echo(1).Returns("one");
  130. //Now we'll misuse Returns.
  131. "".Returns("I shouldn't be calling returns like this!");
  132. });
  133. Assert.That(exception.Message, Is.StringContaining(expectedMessagePrefix));
  134. }
  135. [Test]
  136. public void Returns_Null_for_string_parameter()
  137. {
  138. const string stringValue = "something";
  139. _something.Say(stringValue).ReturnsNull();
  140. Assert.That(_something.Say("something"), Is.Null);
  141. }
  142. [Test]
  143. public void Returns_Null_for_method_returning_class()
  144. {
  145. _something.SomeAction().ReturnsNull();
  146. Assert.That(_something.SomeAction(), Is.Null);
  147. }
  148. [Test]
  149. public void Returns_Null_for_any_args_when_string_parameter()
  150. {
  151. _something.Say("text").ReturnsNullForAnyArgs();
  152. Assert.That(_something.Say("something"), Is.Null);
  153. }
  154. [Test]
  155. public void Returns_Null_for_any_args_when_class_returned()
  156. {
  157. _something.SomeActionWithParams(2, "text").ReturnsNullForAnyArgs();
  158. Assert.That(_something.SomeActionWithParams(123, "something else"), Is.Null);
  159. }
  160. #if NET45 || NET4 || NETSTANDARD1_5
  161. [Test]
  162. public void Return_a_wrapped_async_result()
  163. {
  164. _something.CountAsync().Returns(3);
  165. Assert.That(_something.CountAsync(), Is.TypeOf<Task<int>>());
  166. Assert.That(_something.CountAsync().Result, Is.EqualTo(3));
  167. }
  168. [Test]
  169. public void Return_multiple_async_results_from_funcs()
  170. {
  171. _something.CountAsync().Returns(
  172. _ => 1,
  173. _ => 2,
  174. _ => 3);
  175. Assert.That(_something.CountAsync().Result, Is.EqualTo(1), "First return");
  176. Assert.That(_something.CountAsync().Result, Is.EqualTo(2), "Second return");
  177. Assert.That(_something.CountAsync().Result, Is.EqualTo(3), "Third return");
  178. Assert.That(_something.CountAsync().Result, Is.EqualTo(3), "Fourth return");
  179. }
  180. #endif
  181. [SetUp]
  182. public void SetUp()
  183. {
  184. _something = Substitute.For<ISomething>();
  185. }
  186. }
  187. }