先决条件:我正在使用Play的最新版本!框架和Java版本(不是Scala).
我需要在创建用户时将消息发布到消息队列,并且我想测试该行为.我的问题是让这个很容易测试.
在其他框架中,我将要做的是在控制器中使用构造函数注入并在我的测试中传入一个模拟队列; 然而,玩Play!控制器是静态的,这意味着我new MyController(mockedQueue)
在测试中无法做到.
我可以使用Google Guice并@Inject
在我的控制器中的静态字段上添加注释,但这对我来说并不是很好,因为它或者意味着我必须将该字段公开以在测试中被替换,或者我必须在我的测试中使用容器.我更喜欢使用构造函数注入,但玩!似乎不方便.
通常说你的逻辑应该在你的模型中,而不是你的控制器.那讲得通; 但是,我们在这里不是Ruby,让你的实体与外部服务(电子邮件,消息队列等等)进行交互的可测试性远远低于动态环境,在这种环境中你可以MessageQueue
随意用模拟实例替换静态调用.
如果我让我的实体调用队列,那怎么可测试?
当然,如果我进行端到端的集成测试,这两种情况都是不必要的,但我不需要为我的测试运行而调整消息队列或SMTP服务器.
所以我的问题是:我如何模拟我的游戏!控制器和/或模型,以促进测试与外部服务的交互?
Ruby中的依赖注入框架几乎被宣布为不必要的.Jamis Buck去年在他的LEGO,Play-Doh和Programming博客文章中写到了这一点.
普遍接受的替代方案似乎是使用某种程度的构造函数注入,但只是提供默认值.
class A
end
class B
def initialize(options={})
@client_impl = options[:client] || A
end
def new_client
@client_impl.new
end
end
Run Code Online (Sandbox Code Playgroud)
这种方法对我来说很好,但似乎缺少更传统的设置:在运行时基于某些外部开关替换实现的方法.
例如,使用依赖注入框架,我可以做这样的事情(pesudo-C#):
if (IsServerAvailable)
container.Register<IChatServer>(new CenteralizedChatServer());
else
container.Register<IChatServer>(new DistributedChatServer());
Run Code Online (Sandbox Code Playgroud)
此示例仅IChatServer
根据我们的中央服务器是否可用来注册不同的实现.
由于我们仍然只是在Ruby中使用构造函数,因此我们没有对所使用的依赖项进行编程控制(除非我们自己指定每个依赖项).Jamis提供的示例似乎非常适合使类更易于测试,但似乎缺少替换设施.
我的问题是,你是如何在Ruby中解决这种情况的?我愿意接受任何答案,包括"你根本不需要这样做".我只是想了解Ruby对这些问题的看法.
我有一种感觉,我可能已经知道这个问题的答案,但无论如何我都会问.
有没有更好的方法来使用.Net Profiling API而不是COM/Managed C++路由?
我不愿意遵循建议的COM方法是这样的:
我遇到了一个名为NProf的项目,它试图用管理层包装API.不幸的是,它自2003年以来一直没有更新.
有没有人有任何可能有帮助的线索?这一切都感觉有点讨厌.
澄清:
问题是,在删除和推送分支后,它不会永远丢失,它仍然存储在存储库中.我删除了大量不必要文件的分支,但只要它仍然在git存储库中的某个地方,git clone命令持续时间太大了.
现在我唯一看到的方法是删除整个存储库并重新创建它,但没有不必要的分支.
这有点奇怪.我试图存根一个有参数的方法,我不关心参数是什么,所以我忽略了参数.它看起来像这样:
List<Foo> ignored;
A.CallTo(() => fake.Method(out ignored))
.Returns(something);
Run Code Online (Sandbox Code Playgroud)
当调用stubbed方法时,这样工作没有任何问题:
List<Foo> target;
var result = service.Method(out target);
Run Code Online (Sandbox Code Playgroud)
但是,在target
预先初始化时它不起作用.例如:
List<Foo> target = new List<Foo>();
var result = service.Method(out target);
Run Code Online (Sandbox Code Playgroud)
当我检查Tag
假的时,我可以看到out参数被记录为,<NULL>
所以我怀疑当out目标已经设置为某些东西时它们不匹配.我已经尝试ignored
在我的测试中设置new List<Foo>()
并尝试A<List<Foo>>.Ignored
但是对结果都没有任何影响.
所以我的问题是,如果out参数目标已经有值,有没有人知道如何使用out参数存根方法?
我需要将a的属性UserControl
直接绑定到另一个控件,而不是该控件上的任何特定属性.实现这一目标的最佳方法是什么?我尝试了各种Binding
属性组合无济于事.
对于某些上下文,它UserControl
具有一个Next
属性,用于指定导航层次结构中下一个控件; 它类似于TabIndex
上下文敏感的导航.
<c:MyControl x:Name="First" Next="{Binding ???}" />
<c:MyControl x:Name="Second" />
Run Code Online (Sandbox Code Playgroud)
通过阅读文档,我认为我应该能够做到:{Binding Source=Second, BindsDirectlyToSource=True}
但是那不起作用.
我在这里运行这个示例:https://github.com/jagregory/fluent-nhibernate/blob/master/src/Examples.FirstProject/Program.cs
String类型的所有C#属性都映射到TEXT sql字段而不是
nvarchar OR varchar,除了它作为DEFAULT设置.
我怎么能改变呢?
我知道我可以这样做:
Map(x => x.Name).CustomSqlType("nvarchar").Length(50); // does not work !!!
Map(x => x.Name).CustomSqlType("nvarchar (50)"); // does work !!!
Run Code Online (Sandbox Code Playgroud)
但我不想改变每个领域......
更新:...因此我可以通过=>进行自定义约定
我要做的是编写一个自定义的公约类,如:
public class ColumnStringToNVarCharConvention : IPropertyConvention, IPropertyConventionAcceptance
{
public void Apply(IPropertyInstance instance)
{
instance.CustomSqlType("nvarchar");
}
public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
{
criteria.Expect(x => x.Property.GetType().Equals(typeof(string)));
}
}
Run Code Online (Sandbox Code Playgroud)
有人可以正确上述代码吗?我测试了它,它没有用,为什么...
我一般都是JS的新手,但我试图从MongoDB中查询一些数据.基本上,我的第一个查询检索具有指定会话ID的会话的信息.第二个查询对位于指定位置附近的文档执行简单的地理查询.
我正在使用mongodb-native javascript驱动程序.所有这些查询方法都在回调中返回结果,因此它们是非阻塞的.这是我烦恼的根源.我需要做的是检索第二个查询的结果,并创建一个包含所有返回文档的sessionIds数组.然后我将把它们传递给一个函数.但是,我无法生成此数组并在回调之外的任何位置使用它.
有谁知道如何正确地做到这一点?
db.collection('sessions', function(err, collection) {
collection.findOne({'sessionId': client.sessionId}, function(err, result) {
collection.find({'geolocation': {$near: [result.geolocation.latitude, result.geolocation.longitude]}}, function(err, cursor) {
cursor.toArray(function(err, item) {
console.log(item);
});
});
});
Run Code Online (Sandbox Code Playgroud) .net ×2
node.js ×2
binding ×1
c# ×1
convention ×1
deployment ×1
fakeiteasy ×1
git ×1
java ×1
javascript ×1
mongodb ×1
monit ×1
profiling ×1
ruby ×1
sqlite ×1
string ×1
testing ×1
text ×1
unit-testing ×1
upstart ×1
wpf ×1