Я новичок в использовании Moq, и я не могу найти способ сделать это. У меня есть частный метод generateId, называемый
/// <summary>
/// Generates a call Id for external interfaces
/// </summary>
/// <returns></returns>
private string GenerateCallId()
{
return "EX" + SharedServicesClientProxy.Instance.GenerateId().ToString();
}
Я хотел unit test этот метод, и по этой причине мне нужно высмеять прокси. SharedServicesClientProxy - это просто объект, который реализует интерфейс ISharedServices, но добавляет синглтон. Я хотел проверить, что все строки правильно вернули строку, начинающуюся с "EX". это мой unit test, используя Moq
/// <summary>
/// A test for GenerateCallId
/// A CallId for external systems should always start by "EX"
///</summary>
[TestMethod()]
[DeploymentItem("myDll.dll")]
public void GenerateCallIdTest()
{
myService_Accessor target = new myService_Accessor();
var SharedServicesClientProxy = new Mock<ISharedServices>();
SharedServicesClientProxy.Setup(x => x.GenerateId()).Returns(5396760556432785286);
string actual;
string extCallIdPrefix = "EX";
actual = target.GenerateCallId();
Assert.IsTrue(actual.StartsWith(extCallIdPrefix));
}
Думаю, я делаю свой макет в неправильном месте?
В более общем виде, как я обманываю объект, который будет вызываться методом, который я тестирую? например:
/// <summary>
/// dummy test
///</summary>
[TestMethod()]
[DeploymentItem("myDll.dll")]
public void Foo()
{
myService_Accessor target = new myService_Accessor();
boolexpected = false;
actual = target.Foo();
Assert.IsTrue(actual,expected);
}
/// <summary>
/// Foo
/// </summary>
/// <returns></returns>
private bool Foo()
{
return this.Bar();
}
Мне нужен бар moq, но где мне это нужно? Благодаря, Себ
Ищите термин "инъекция зависимостей" перед продолжением.
У вас есть зависимость от SharedServicesClientProxy.Instance
, которая является Singleton. Это вызовет проблемы с тестовой изоляцией, поскольку вы будете повторно использовать один и тот же экземпляр в тестах и быть подвержены проблемам, оставленным в состоянии.
Я бы посоветовал встраивать такие зависимости (и OT - вы не должны тестировать частные методы... протестировать через публичный интерфейс. Там он отсутствует в моей системе..:)
public class AnonClass
{
ISharedServices _sharedServices;
AnonClass(ISharedServices sharedServicesObj)
{
_sharedServices = sharedServicesObj;
}
public string GenerateCallId()
{
return "EX" + _sharedServices.GenerateId().ToString();
}
}
Повторите свой текущий код, чтобы создать целевой класс, подобный этому
var class = new AnonClass(SharedServicesClientProxy.Instance);
В вашем тесте передайте объект-макет вместо объекта, возвращаемого Singleton