【发布时间】:2017-04-28 09:13:40
【问题描述】:
背景 我的应用程序正在通过代理使用 WCF 服务。我必须对我的实现进行单元测试,以确保它使用服务并正确完成处理。
待测方法
public class MyClass
{
private ManagerServiceClientImpl myclient;
public void MethodToBeTested();
{
var result = GetServiceData();
if(result!=null)
//some processing
}
}
private MyObject GetServiceData()
{
myclient = ServiceLocator.Current.GetInstance<ManagerServiceClientImpl>();
if(myclient.ConnectToService() && myclient.MyServiceClient.IsConnected)
return myclient.GetData();
else
return null;
}
这是外部来源提供的,我无权修改
public class ManagerServiceClientImpl
{
public ServiceClient MyServiceClient { get; private set; }
public bool ConnectToService()
}
我将如何模拟 ManagerServiceClientImpl 它没有接口或方法未标记为虚拟
到目前为止我尝试了什么。
[TestMethod]
public void IsServiceConnected_GetData()
{
//Arrange
ManagerServiceClientImpl clientImpl =
MockRepository.GenerateMock<ManagerServiceClientImpl>();
ServiceLocator.Expect(x => x.GetInstance<ManagerServiceClientImpl>())
.Return(clientImpl);
var testData= new MyObject
{
ID = "Test1",
Name ="test",
}
//Act
_myClass.MethodToBeTested();
//Assert
stubService.AssertWasCalled(h => h.SaveAllChanges());
}
注意:使用 Rhino.Mocks。这是我第一次使用 Rhino 模拟
【问题讨论】:
-
将第 3 方依赖项包装在您在代码中控制的抽象中,并且能够修改和模拟。避免服务定位器反模式,这会使代码难以测试,正如您已经发现的那样。这是一个设计问题。
-
你能举个例子吗
-
首先您需要澄清要测试的方法,因为您的示例不清楚。
-
我没有完全理解你
MethodToBeTested();是要测试的。该方法中的逻辑非常小。如果服务数据不在清单中,则添加到清单中。我不确定这是你要求的。请原谅我的英语` -
检查你的小例子,看看它是否能编译。这不是minimal reproducible example。到目前为止,您尝试过的代码还引用了在被测方法中甚至没有指明的方法。你明白我的意思吧?
标签: c# unit-testing wcf rhino-mocks