Как смоделировать результат DbRawSqlQuery <int>? - PullRequest
0 голосов
/ 19 апреля 2019

Я создал метод для проверки того, что в БД есть хранимая процедура.

public class StoredProcedure : IStoredProcedure
{
    private readonly IDbContextProvider<MyDbContext> _dbContextProvider;

    public StoredProcedure(IDbContextProvider<MyDbContext> dbContextProvider)
    {
        _dbContextProvider = dbContextProvider;
    }

    public bool ExistsStoredProcedure(string procedureName)
    {   
        var query = string.Format(
            "SELECT COUNT(*) FROM [sys].[objects] WHERE [type_desc] = 'SQL_STORED_PROCEDURE' AND [name] = '{0}';",
            procedureName);
        var request = _dbContextProvider.DbContext.Database.SqlQuery<int>(query).Single();

        return request > 0 ? true : throw new UserFriendlyException(
            $"Хранимая процедура {procedureName} не найдена в БД {_dbContextProvider.DbContext.Database.Connection.Database}");
    }
}

Также я хочу написать для него юнит-тест.

public class StoredProcedureTests
{
    private readonly IStoredProcedure _storedProcedure;

    private readonly Mock<IDbContextProvider<MyDbContext>> _mockDbProvider;

    public StoredProcedureTests()
    {
        _mockDbProvider = new Mock<IDbContextProvider<MyDbContext>>();
        _storedProcedure = new StoredProcedure(_mockDbProvider.Object);
    }

    [Fact]
    public void CheckValueIfStoredProcedureExist()
    {   
        const int count = 1;
        var rawMock = new Mock<DbRawSqlQuery<int>>();
        rawMock.Setup(i => i.Single()).Returns(count);
        _mockDbProvider.Setup(i => i.DbContext.Database.SqlQuery<int>(It.IsAny<string>())).Returns(rawMock.Object);
        var result = _storedProcedure.ExistsStoredProcedure(string.Empty);
        Assert.True(result);
    }
}

Но я получаю сообщение об ошибке при попытке выполнить rawMock.Setup

try
{
    rawMock.Setup(i => i.Single()).Returns(count);
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    throw;
}

Неверная настройка для метода расширения: i => i.Single ()

Как правильно написать эту заглушку?

UPD Я стараюсь, как советовал Джонни

try
{
    IEnumerable<int> list = new List<int> {1};
    var mq = new Mock<DbRawSqlQuery<int>>();
    mq.Setup(i => i.GetEnumerator()).Returns(list.GetEnumerator);

    _mockDbProvider.Setup(i => i.DbContext.Database.SqlQuery<int>(It.IsAny<string>())).Returns(mq.Object);
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
    throw;
}

И у меня новая ошибка

Неверная установка для не виртуального (переопределяемого в VB) члена: i => i.DbContext.Database.SqlQuery (It.IsAny (), new [] {})

...