Думаю, вы можете использовать CallBase = true
. Таким образом, ваш макет будет вести себя как настоящий класс.
var dataManager = new Mock<DataManager>(loggingService.Object, configuration.Object) { CallBase = true };
dataManager.Object.Method1();
dataManager.Object.Method2();
И вы можете имитировать некоторые методы, как вы это делаете с утилитой.
Поиск по «CallBase» на странице:
https://github.com/Moq/moq4/wiki/Quickstart
ОБНОВЛЕНИЕ Я сделал методы publi c для их вызова. И есть проблема, которую я не видел в прошлый раз. Вам необходимо создать «виртуальные» методы, если вы хотите изменить их поведение.
Вот пример кода. Как видите, GetClientValues()
возвращает реальные данные, потому что мы вызываем реальную реализацию по умолчанию с помощью CallBase = true
, а GetData()
возвращает фиктивные данные, потому что мы имитировали его поведение.
public class DataManager
{
public DataManager(ILoggingService loggingService, IConfiguration configuration)
{
// ...
}
// how to mock this to return dummy data?
public virtual DataHolder GetData()
{
return new DataHolder
{
Data = "RealData"
};
}
// how to mock this to return dummy data?
public IEnumerable<ProcessClient> GetClientValues(string value)
{
return new List<ProcessClient>
{
new ProcessClient
{
Data = "RealData"
}
};
}
}
И тесты.
public class Tests
{
[SetUp]
public void Setup()
{
}
[Test]
public void Test1()
{
var loggingService = new Mock<ILoggingService>();
var config = new Mock<IConfiguration>();
var dataManager = new Mock<DataManager>(loggingService.Object, config.Object){CallBase = true};
dataManager.Setup(x => x.GetData()).Returns(new DataHolder { Data = "FakeData" });
Assert.AreEqual("RealData", dataManager.Object.GetClientValues("test").First().Data);
Assert.AreEqual("FakeData", dataManager.Object.GetData().Data);
}
}
Но в любом случае я думаю, что этот подход не годится для тестирования. Проблема с тестированием приватных методов. У нас есть несколько способов (например, Invoke()
), но в целом «если вы хотите провести модульное тестирование частного метода, что-то может быть не так». Я хотел бы порекомендовать вам прочитать что-нибудь о дизайне тестов и написании тестируемого кода. О тестировании частных методов Как вы проводите модульное тестирование частных методов? .