我有一组基本测试,用于测试接口的多个实现.我对其进行模拟的方法是创建一个带有[Ignore]属性的基础文本夹具.
[TestFixture]
[Ignore]
public class BaseTests
{
// Use your imagination for the actual name
public virtual ITestableThing GetConcrete()
{
return null;
}
// All of my unit tests here
}
Run Code Online (Sandbox Code Playgroud)
然后我为每个接口实现编写一个子类:
public class ConcreteThingTests : BaseTests
{
public override ITestableThing GetConcrete()
{
return new ConcreteThing();
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用,因为我在一个地方完成了所有实现的所有测试,子类只是指定了实现.
问题是我必须将[Ignore]属性放在基类上,否则NUnit将尝试运行测试(并失败).
因此,我的测试结果总是被一组忽略测试混乱,虽然这不是什么大问题,但我认为可能有一个更好的模式,避免不得不忽略测试.
那么,我实现测试夹具继承错了吗?
在单独的模式中连接两个表时是否存在性能损失(但在同一数据库中).
我的物理模型有几个不同的部分很好地适合他们自己的模式,但我偶尔需要加入模式,我一直无法找到有关这是否会对性能产生负面影响的任何信息.
我有一个基本的存储库框架,最终执行查询并将结果映射回对象:
例如:
public SomeEntity Get(id)
{
return base.GetItem<SomeEntity>
("select * from SomeEntities where id = @idParam",
new { idParam = id});
}
Run Code Online (Sandbox Code Playgroud)
如果这看起来像Dapper,那是因为引擎盖GetItem正在包装Dapper.
我想为GetItem添加自动缓存,我有两个参数:
我担心对这些参数执行简单的主要哈希会导致缓存密钥冲突,当您从缓存中提取数据时,冲突可能非常非常糟糕(IE泄漏敏感信息).
那么,我有哪些技术可以生成合理大小的缓存键,同时保证基于查询和参数输入的唯一性?
我正在研究需要接受合同(指定为接口)的东西,并动态创建一个实例,没有任何符合此接口的正式定义的具体类.
语法的一个例子是这样的:
IExampleMessage message = MessageBuilder.Create<IExampleMessage>(x => {
x.PropertyA = "Test";
x.PropertyB = 5;
});
Run Code Online (Sandbox Code Playgroud)
我已经看到其他.NET库和框架提供这样的行为(NServiceBus浮现在脑海中),我想知道是否有第三方库抽象出运行时代码.我认为Castle DynamicProxy是一个值得关注的地方,但这似乎完全集中在代理和拦截上,并且似乎没有公开代码生成方面.
我可以编写一个使用Reflection.Emit来实时创建类的实现,但是我宁愿使用一个可靠的开源库(如果存在的话).
有什么建议?
在我记得将我的.hgignore文件复制到工作目录之前,我开始了一个新项目并在Mercurial中进行了六次本地提交.
所以,现在我有一堆二进制和调试符号文件,我想追溯删除.
我没有把这个项目推到遥控器,所以我可以把垃圾文件夹丢弃并重新开始,这是一个选项.
然而是否有某种类型的扩展HG读取.HgIgnore并从变更集中修剪这些文件?
我有一个有趣的问题可以通过多种方式解决:
这是对实际应用程序的高度抽象解释,只是为了问题的目的而试图深入到核心概念.
该函数将需要存储状态以检测重复项.它还需要存储相关的时间戳才能使重复期满.
它不需要存储字符串,字符串的唯一哈希就可以了,假设没有因冲突而产生的误报(使用完美的哈希?),并且哈希函数的性能足够高.
天真的实现将是简单的(在C#中):
Dictionary<String,DateTime>
Run Code Online (Sandbox Code Playgroud)
虽然为了降低内存占用并可能提高性能,我正在评估一个自定义数据结构来处理这个而不是基本哈希表.
所以,鉴于这些限制,你会用什么?
编辑,一些可能会改变建议实施的其他信息:
如果我使用hg创建一个新的分支:
$ hg branch newbranch
Run Code Online (Sandbox Code Playgroud)
然后看看分支:
$ hg branches
default 194:d9df55198e53
newbranch 193:a36a491b8507 (inactive)
Run Code Online (Sandbox Code Playgroud)
newbranch被标记为(不活动),尽管我的工作直接当前映射到它.
如果我执行提交,则默认将被标记(不活动).
但是,如果我切换到默认,合并和提交,然后切换回newbranch,newbranch将再次说(不活动).
这有点痛苦,因为我可能会在星期五晚上这样做,直到星期一才回来,而且不知道我的工作目录实际指向的是哪个分支.
那么,是否有更好的方式来判断,或者我应该始终将其作为我的工作流程来指定我想要在开始之前工作的分支.