I am completely new to unit testing and I tried to write unit testing for crud operation. I could write unit tests for get by id and get all. But the problem arises when writing the unit test for create and update.
This is my controller code for the create method
public async Task<IActionResult> Create([FromBody] Message message)
{
var duplicatemessage = await _messageService.DuplicateMessage(message.Text);
if (duplicatemessage == null)
{
_messageService.Create(message);
return CreatedAtRoute("Api", new { id = message.Id.ToString() }, message);
}
else
{
return BadRequest(new { message = "Text Already Exist" });
}
}
This is the unit test I wrote for the create method
[TestCase("Hello")]
public async Task Create_StateUnderTest_ExpectedBehavior(Message message)
{
// Arrange
// mockMessageService.Setup(t => t.GetId(id)).ReturnsAsync(new Message());
mockMessageService.Setup(t => t.DuplicateMessage(message.Text)).ReturnsAsync(new Message());
mockMessageService.Setup(t => t.Create(message)).Returns(new Message());
var apiController = this.CreateApiController();
//var message1 = new Message() { Text = "Hello" };
// Act
var result = await apiController.Create(message);
// Assert
Assert.IsInstanceOf<CreatedAtRouteResult>(result);
this.mockRepository.VerifyAll();
}
When I run the test I am getting this error
Message: System.ArgumentException : Object of type 'System.String' cannot be converted to type 'HelloApi.Models.Message'.
Stack Trace: RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast) RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) MethodBase.Invoke(Object obj, Object[] parameters) Reflect.InvokeMethod(MethodInfo method, Object fixture, Object[] args)
I tried to debug but debug point did not hit. and I tried, Test api CRUD operation with Moq and How can I convert an Class Object into String? this but I don't think it is related to my problem. can anyone help me, please?