背景:起订量多接口
我已经剥离了一个简单的代理事情在线上和部分发现我需要的实例部分基于我的WCF客户端。
用于创建客户端代理作为其公知的用法是:
WcfClientProxy<IServicecontract> clientProxy =
new WcfClientProxy<IServiceContract>();
WcfClientProxy有一个称为执行这需要方法:Expression<Func<TChannel, TResult>>
或Expression<Action<TChannel>>
。
我想要实现:
我想嘲笑这起订量使用,所以我可以测试通过客户服务合同的呼吁。
所以嘲笑这样的电话..
clientProxy.Execute(m=>m.DoSomeAction(5));
问题:
的问题是,模拟不起作用。我得到这个错误:
“抛出异常: System.NullReferenceException:对象引用未设置为对象的实例。”
我的测试服务合同是:
public interface ITestingServiceInterface : System.ServiceModel.IClientChannel
{
string Version();
VersionDetail VersionDetail();
IList<VersionDetail> VersionDetails();
void DoSomeDelete(int itemId);
}
WCF客户端代理接口:
public interface IWcfClientProxy<TChannel> where TChannel : ICommunicationObject
{
bool ThrowOnException { get; set; }
TResult Execute<TResult>(Expression<Func<TChannel, TResult>> operation);
void Execute(Expression<Action<TChannel>> expression);
}
我试图测试,并与设置模拟..
private List<ProdItem> items;
private Mock<IWcfClientProxy<ITestingServiceInterface>> mockClientProxy;
[TestInitialize]
public void SettingUp()
{
mockClientProxy = new Mock<IWcfClientProxy<ITestingServiceInterface>>();
items = new List<ProdItem>();
for(int i =0; i<10; i++){
items.Add(new ProdItem { ProdItemId = i, LocalStock = i });
}
}
[TestMethod]
public void SimpleTest()
{
mockClientProxy.Setup(m => m.Execute(x => x.DoSomeDelete(It.IsAny<int>()))).Callback(RemoveItem);
var client = mockClientProxy.Object;
client.Execute(x => x.DoSomeDelete(4));
Assert.AreEqual(9, items.Count);
}
public void RemoveItem()
{
items.RemoveAt(items.Count - 1);
}
此错误测试实际上是断言是错误的,似乎回调从未被击中。
我确信我刚刚做了一些愚蠢的事情。
更新: 显示的,我想怎样能够测试上述工作的例子..
[TestMethod]
public void SimpleTest()
{
mockClientProxy.Setup(m => m.Execute(x => x.DoSomeDelete(It.IsAny<int>()))).Callback(RemoveItem);
var client = mockClientProxy.Object;
var stockHelper = new StockHelper(client);
stockHelper.DeleteItem(5);
Assert.AreEqual(9, items.Count);
}
在上面,我是测试StockHelper类需要在客户端代理它的构造函数通过它来调用WCF。
要测试StockHelper(或什么),我需要能够模拟客户端及其服务调用。上面的(第一)例子恶魔 - 直截了当地试图做到这一点。
我希望这是有道理的,请参阅我的最终目标不是测试模拟..这正是我必须尝试调试我的问题。
客户端代理一般会被传递到的东西,说一个辅助类。那么测试就是测试助手类而不是代理,但是因为我目前还没有证明这个代理是一个例子。如果我没有传递参数给服务方法,它按预期工作。 – 2012-04-02 10:14:54
我已经更新了这个问题,(刚才看到您的更新后的答案)我是否需要使用验证而不是设置退货和回叫?那会是我的问题吗? – 2012-04-02 10:24:42
代理具有方法'执行'。所以你需要验证这个方法是用正确的参数调用的。如果需要,您可以为模拟方法提供一些假返回值。 (对不起午餐时间,将在一小时内):) – 2012-04-02 10:27:35