NSubstitute icon indicating copy to clipboard operation
NSubstitute copied to clipboard

The object is returned the second time

Open IlyaZanegin opened this issue 1 year ago • 2 comments

Hello everybody!

why is an empty object returned the first time? Please explain to me


using NSubstitute;
using System.Net;
using System.Reflection;
using Xunit;
using Assert = Xunit.Assert;

namespace RepositoryServiceTests
{
	public class ApiResult<T>
	{
		public HttpStatusCode StatusCode { get; set; }
		public T? Value { get; set; }
	}

	public abstract class BaseClass
	{
		protected virtual async Task<ApiResult<string>> DownloadFile(string path1, string path2)
		{
			var result = new ApiResult<string>();
			await Task.CompletedTask;
			return result;
		}
	}

	public class SomeClass : BaseClass
	{
		public async Task<string?> Download(string path1, string path2)
		{
			var result1 = await DownloadFile(path1, path2);   //return null. why???????????????????????????????
			var result2 = await DownloadFile(path1, path2);   //return object

			return result2.Value;
		}
	}

	public class TestClass
	{
		[Fact]
		public async Task TestMethod()
		{
			// Arrange
			var someClass = Substitute.For<SomeClass>();

			var model = Task.FromResult(
				new ApiResult<string>
				{
					StatusCode = HttpStatusCode.OK,
					Value = "path to file"
				});

			var method = someClass.GetType().GetMethod("DownloadFile", BindingFlags.NonPublic | BindingFlags.Instance);
			method!.Invoke(someClass, [Arg.Any<string>(), Arg.Any<string>()]).Returns(model);

			// Act
			var result = await someClass.Download(Arg.Any<string>(), Arg.Any<string>());

			// Assert
			Assert.NotNull(result);
		}
	}
}

IlyaZanegin avatar Sep 17 '24 07:09 IlyaZanegin