MOQ — Настройка базы IDatabase макетного интерфейса для базы данных SQLD

#c# #testing #moq #xunit

Вопрос:

В коде я просто использую:

 public interface IDatabase
{
    void Save();
}


public class SqlDatabase : IDatabase
{
    public void Save()
    {
        Console.WriteLine("Saving data to Database");
    }
}
 

// Простой класс вызова…отлично работает!

IDatabase database = new SqlDatabase();

Как мне это сделать в MOQ?
Mock<IDatabase> mockDatabase = new Mock<SqlDatabase>(); не работает!!!

Ошибка CS0029 Не удается неявно преобразовать тип SQLDatabase в IDatabase

/////// МОДУЛЬНЫЙ ТЕСТ

     [Fact]
                public void SaveToDatabase()
                {
                    string comment = "Team, I know that times are tough! Product sales have been disappointing for the past three quarters. We have a competitive product, but we need to do a better job of selling it!";
        
                    Mock<IDatabase> mockDatabase = new Mock<IDatabase>();
    
// Not Required!
    // Mock<AnalyzerModel> mockAnalyzerModel = new Mock<AnalyzerModel>();
                // mockDatabase.Setup(x => x.Save(mockAnalyzerModel.Object));
        
                    var sut = new ToneAnalyzerEngine(mockDatabase.Object);
                    var v = sut.Analyze(comment, MockToneAnalyzerResultSadness());
        
                    mockDatabase.Verify(x => x.Save(It.IsAny<AnalyzerModel>()), Times.Once);
        
                    mockDatabase.VerifyNoOtherCalls();
                }

/////// Code Called

        internal bool Analyze(string comment, ToneAnalyzerResult toneAnalyzerResult)
        {
            bool isPositive = IsPositive(toneAnalyzerResult);

            AnalyzerModel analyzerModel = CreateAnalyzerModel(Guid.NewGuid().ToString(), isPositive, comment);

            _database.Save(analyzerModel);
            return isPositive;
        }
 

Комментарии:

1. Это будет Mock<IDatabase> mockDatabase = new Mock<IDatabase>(); . Зачем вам нужен макет<SQLDatabase> ?

2. Я пытаюсь создать базу данных.Проверьте метод сохранения, но всегда получаю 0 раз! (вместо 1)

3. Пожалуйста, добавьте тестовый код и, что еще лучше, код, который находится в стадии тестирования.

4. Попробуйте настроить свой Save метод. Добавьте mockDatabase.Setup(x => x.Save()); сразу после создания макета.

5. Это на самом деле правильное сообщение. Вызов Save происходит, но идет с другим объектом. Ваша настройка должна выглядеть следующим образом: mockDatabase.Setup(x => x.Save(It.IsAny<AnalyzerModel>()); — указание того, что вы ожидаете вызовов Save , но не знаете, каким будет фактический аргумент. А затем вы снова проверяете вызов через mockDatabase.Verify(x => x.Save(It.IsAny<AnalyzerModel>()), Times.Once); : снова It.IsAny<AnalyzerModel>() означает, что вы не знаете, какой фактический экземпляр AnalyzerModel будет передан Save