为了进一步专业化我们的测试方法,我正在使用Visual Studio中的单元测试框架进行一些集成测试。
正在测试的对象是一个WCF服务,我的小应用程序使用ServiceHost在内存中运行服务,我可以调用我的测试中公开的方法。
这一切都运行正常,但我希望能够在测试后使用Transactions恢复数据库。为了实现这一点,我将TransactionScopeRequired属性添加到了测试中的方法,并尝试在TransactionScope中调用它。
但后来我注意到TransactionScope没有内置的回滚方法,因此在方法完成后,创建的对象当然仍在数据库中。
所以我尝试不使用'完整'方法,经过一些谷歌搜索我发现只是使用Dispose手动shoud回滚事务。唉,既没有奏效。所以我继续启动SQL Server Analyzer来查看生成的SQL,也许我可以在那里找到一些TRANSACTION语句。
我注意到的第一件事是所有相关的查询都是作为存储过程(由EF生成)执行的。第二件事是我无法区分相关查询中的任何类型的事务管理。
现在我的问题:无论好坏,这可以在这个级别上解决吗?如果是这样的话?是否可以使用这样的“外部”交易?
答案 0 :(得分:1)
要回滚交易,您可以:
Transaction.Current.Rollback();
Transaction.Complete();
检查服务器端,Transaction.Current不为null。所以你知道你是否有当前的交易
允许Tx:
在界面方法上:
[OperationContract的]
[TransactionFlow(TransactionFlowOption.Allowed)]
public void Method(int value);
在服务器方法实现上:
[OperationBehavior(TransactionScopeRequired =真,
TransactionAutoComplete =真)]
public void Method(int value){...}
在客户端和服务器端的绑定允许事务流:
使用代码:
var wsHttpBinding = new WsHttpBinding();
wsHttpBinding.TransactionFlow = true;
或使用XML:
<endpoint address="wsHttpTx" binding="wsHttpBinding"
contract="counters.ICountersService"
bindingConfiguration="wsHttpTx"/>
...
<wsHttpBinding>
<binding name="wsHttpTx" transactionFlow="true" />
</wsHttpBinding>
此致
答案 1 :(得分:0)
据我了解你的问题: 1)您尝试使用事务范围在Test方法中打开新事务 2)您在此事务范围内调用WCF服务 3)您的服务会进行一些数据库更改。
要回滚更改,您不应该调用事务范围的完整方法。我总是善于在using
中创建事务范围,最终自动Dispose。
所以现在您的服务应该支持来自客户端的事务传播。请参阅相同的问题(Calling WCF service method from transaction scope)并阅读MSDN文章(https://msdn.microsoft.com/en-us/library/ms730250.aspx)
注意:有几篇文章 - How to enable transactions,How to configure service
但老实说,对于我来说,如果真正的客户端没有真正的要求来支持事务并且在传输/消息/序列化器级别上没有一些WCF特定的定制(例如WCF拦截器),那么仅仅使得测试事务变得过度。 我要么直接测试服务类,要么不运行服务主机,要么在测试后用手动恢复数据库状态创建某种TearDown清理。