#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