Moq代理单元测试
问题描述:
我是使用Moq的新手,我找不到这样做的方法。 我有一个generateId私有方法,称为Moq代理单元测试
/// <summary>
/// Generates a call Id for external interfaces
/// </summary>
/// <returns></returns>
private string GenerateCallId()
{
return "EX" + SharedServicesClientProxy.Instance.GenerateId().ToString();
}
我想单元测试这种方法,因为这个原因,我需要模拟代理。 SharedServicesClientProxy只是一个实现接口ISharedServices但添加单例的对象。我想测试所有的字符串是否正确地返回了一个以“EX”开头的字符串。这是我的单元测试,使用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酒吧,但如果我需要做的呢? 谢谢, Seb
答
在继续之前搜索术语“依赖注入”。
您对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);
在您的测试,通过在模拟对象,而不是由辛格尔顿
返回的对象