Moq.Dapper icon indicating copy to clipboard operation
Moq.Dapper copied to clipboard

Testing Query with string array parameter

Open Dev99987 opened this issue 2 years ago • 1 comments

Hi,

I have been trying to test one of my Dapper repository methods which uses a string array as one of it's input parameters. The method itself works great but when I run the test it fails with the following error: System.ArgumentNullException : Value cannot be null. (Parameter 'input')

By removing the array from the input parameters the error goes away. The error occurs at the Query call.

The method I'm testing:

public IEnumerable<DataModel> GetData(string[] stringarrayparameter)
{
    using var log = _logger.CurrentMethodStart();

    var sql = @"
        select * from SameTable where SameColumn IN @stringarrayparameter
    ";

    using var connection = _SqlConnectionFactory.CreateConnection();

    connection.Open();

    return connection.Query<DataModel>(sql, new { @stringarrayparameter});
}

Dapper setup:

public virtual ISqlConnectionFactory GetMockSqlConnectionFactory()
{
    var mockDbConnectionFactory = new Mock<ISqlConnectionFactory>();
    var mockDbConnection = new Mock<IDbConnection>();
    var stringarrayparameter = new[] { "value" };

    var returnValue = new[]
    {
        new ReturnValue()
        {
            a = 1,
            b = 2,
            c = 3
        }
    };

    mockDbConnection.SetupDapper(c => c.Query<DataModel>(It.IsAny<string>(), new { @stringarrayparameter }, null, true, null, null)).Returns(ReturnValue);

    mockDbConnectionFactory.Setup(x => x.CreateConnection()).Returns(mockDbConnection.Object);

    return mockDbConnectionFactory.Object;
}

The test I'm running:

[Fact]
public void Repository_GetData_Ok()
{
    #region ARRANGE

    var sqlConnectionFactory = GetMockSqlConnectionFactory();
    var logger = GetLogger<Repository>(_output);
    var stringarrayparameter = new[] { "value" };

    #endregion ARRANGE

    #region ACT

    var ctr = new Repository(logger, sqlConnectionFactory);
    var act = ctr.GetData(stringarrayparameter);

    #endregion ACT

    #region ASSERT

    var dataModels = act.ToList();
    dataModels.Should().NotBeNull();

    #endregion ASSERT
}

Dev99987 avatar Dec 06 '23 11:12 Dev99987

I have the same questions!!!!

NeroLiang19 avatar Mar 13 '25 05:03 NeroLiang19