我正在尝试为没有单元测试的项目中的函数实现单元测试,并且此函数需要System.Web.Caching.Cache对象作为参数.我一直试图通过使用诸如......之类的代码来创建这个对象.
System.Web.Caching.Cache cache = new System.Web.Caching.Cache();
cache.Add(...);
Run Code Online (Sandbox Code Playgroud)
...然后将'cache'作为参数传递,但Add()函数导致NullReferenceException.到目前为止,我最好的猜测是我不能在单元测试中创建这个缓存对象,需要从HttpContext.Current.Cache中检索它,我显然在单元测试中没有访问权限.
如何对需要System.Web.Caching.Cache对象作为参数的函数进行单元测试?
我有一个独立的Java应用程序,它有一些我想要保护的许可代码,即阻止用户更改我的软件以规避许可.做这个的最好方式是什么?
我看过混淆,但这需要各种各样的问题:反射,序列化,混乱的堆栈跟踪等.也许jar签名可能是一个解决方案?但是如何在运行时验证jar?如何确保用户不更改jar验证码?
我必须启动并运行快速而脏的配置编辑器.流程如下:
配置(服务器上的POCO)序列化为XML.
此时XML已经很好地形成了.配置将发送到XElements中的Web服务器.
在Web服务器上,XML(是,所有IT)被转储到textarea中进行编辑.
用户直接在网页中编辑XML并单击"提交".
在响应中,我检索XML配置的更改文本.此时,所有转义都已通过在网页中显示它们的过程恢复.
我尝试将字符串加载到XML对象(XmlElement,XElement,等等).KABOOM.
问题是序列化会转义属性字符串,但在转换过程中会丢失.
例如,假设我有一个具有正则表达式的对象.以下是Web服务器的配置:
<Configuration>
<Validator Expression="[^<]" />
</Configuration>
Run Code Online (Sandbox Code Playgroud)
所以,我把它放到textarea中,它对用户来说是这样的:
<Configuration>
<Validator Expression="[^<]" />
</Configuration>
Run Code Online (Sandbox Code Playgroud)
因此,用户稍作修改并将更改提交回来.在Web服务器上,响应字符串如下所示:
<Configuration>
<Validator Expression="[^<]" />
<Validator Expression="[^&]" />
</Configuration>
Run Code Online (Sandbox Code Playgroud)
因此,用户添加了另一个验证器,现在BOTH具有非法字符的属性.如果我尝试将其加载到任何XML对象中,它会抛出异常,因为<和&在文本字符串中无效.我不能不能使用任何类型的编码功能,因为它编码整个血腥的东西:
var result = Server.HttpEncode(editedConfig);
结果是
<Configuration>
<Validator Expression="[^<]" />
<Validator Expression="[^&]" />
</Configuration>
Run Code Online (Sandbox Code Playgroud)
这不是有效的XML.如果我尝试将其加载到任何类型的XML元素中,我将会被一个下降的铁砧击中.我不喜欢掉落的铁砧.
那么,问题仍然存在......我是否可以通过使用正则表达式替换来获得解析为XML对象的XML字符串的唯一方法?我加载时有没有办法"关闭约束"?你怎么绕过这个?
最后一个回应,然后维基化,因为我认为没有一个有效的答案.
我在textarea中放置的XML是有效的,转义的XML.1)将其放入文本区域的过程2)将其发送给客户端3)将其显示给客户端4)提交表单,然后将其发送回服务器,以及6)从表格中检索值REMOVES任何和所有逃脱.
让我再说一遍:我不会逃避任何事情.只需在浏览器中显示它就可以了!
需要考虑的事项:有没有办法阻止这种逃避行为的发生?有没有办法采用几乎有效的XML并以安全的方式"清理"它?
这个问题现在有了它的赏金.要收集赏金,您将演示如何在浏览器窗口中编辑VALID XML而不使用第三方/开源工具,该工具不需要我使用正则表达式手动转义属性值,这不需要用户转义其属性,并且在往返时不会失败(& amp; amp; amp; etc;)
我正在使用DataGridViewCheckBoxCell,但我无法弄清楚如何让 - > Value属性"正确"工作.
for (int i = this->dgvConfigs->Rows->Count - 1; i >= 0 ; i --){
DataGridViewCheckBoxCell^ dgvcbc = (DataGridViewCheckBoxCell^) this->dgvConfigs->Rows[i]->Cells[2];
// This is truely a weird behavior of the DataGridViewCheckBoxCell
if (dgvcbc->Value->ToString() == "True"){
// Do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
现在我无法弄清楚 - >价值可能是什么.当我测试
dgvcbc->Value == true
Run Code Online (Sandbox Code Playgroud)
它永远不会触发,或
dgvcbc->Value == dgvcbc->TrueValue
Run Code Online (Sandbox Code Playgroud)
当我在调试器中查看这些值时,它们都是"{true}",但是等式永远不会被评估为true
我甚至试过了
dgvcbc->TrueValue = true;
dgvcbc->Value == dgvcbc->TrueValue
Run Code Online (Sandbox Code Playgroud)
再次,两者都显示为"{true}",但// Do Stuff永远不会匹配
我正在寻找一个很好的C++读写器锁.我们有一个不常见的作家和许多常见读者的用例,并希望为此进行优化.我更喜欢跨平台的解决方案,但只有Windows可以接受.
我想知道是否有可能做这样的事情:
<uc1:TestControl ID="TestControl1" runat="server">
<div>More random HTML, etc...</div>
</uc1:TestControl>
Run Code Online (Sandbox Code Playgroud)
我收到一个错误"类型'System.Web.UI.UserControl'没有名为'div'的公共属性." 做了一点研究,我发现我可以将以下属性添加到服务器控件:
[ParseChildren(false)]
public partial class TestControl : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以从ASP.NET控件中读取内容?
编辑:更改了措辞以反映我很好奇,如果您可以使用服务器或用户控件执行此操作
发生了一些我不确定应该可行的事情.显然它是,因为我已经看过了,但我需要找到根本原因而且我希望你们都能提供帮助.
我们有一个查找纬度和经度的邮政编码系统.我们不是每次都访问它,而是将结果缓存在廉价的内存中HashTable缓存中,因为邮政编码的纬度和长度往往比我们发布的更少.
无论如何,哈希被一个具有"get"和"add"方法的类所包围,这两个方法都是同步的.我们以单身形式访问此类.
我并不是说这是最好的设置,但它就是我们所处的位置.(我计划更改为尽快将Map包装在Collections.synchronizedMap()中.)
我们在多线程环境中使用此缓存,其中我们为2个拉链进行2次调用(因此我们可以计算两者之间的距离).这些有时几乎同时发生,因此两个调用很可能同时访问地图.
就在最近,我们遇到了两个不同邮政编码返回相同值的事件.假设初始值实际上是不同的,有没有办法将值写入Map会导致为两个不同的键写入相同的值?或者,2"获取"是否有任何方式可以交叉电线并意外返回相同的值?
我唯一的另一个解释是初始数据已损坏(错误的值),但似乎不太可能.
任何想法,将不胜感激.谢谢,彼得
(PS:如果您需要更多信息,代码等,请告诉我)
public class InMemoryGeocodingCache implements GeocodingCache
{
private Map cache = new HashMap();
private static GeocodingCache instance = new InMemoryGeocodingCache();
public static GeocodingCache getInstance()
{
return instance;
}
public synchronized LatLongPair get(String zip)
{
return (LatLongPair) cache.get(zip);
}
public synchronized boolean has(String zip)
{
return cache.containsKey(zip);
}
public synchronized void add(String zip, double lat, double lon)
{
cache.put(zip, new LatLongPair(lat, lon));
}
}
public class LatLongPair {
double lat;
double lon;
LatLongPair(double …Run Code Online (Sandbox Code Playgroud) 它目前是700MB,但可以想象它将超过1GB.通常我只是将此文件复制到另一个位置(对于好奇的,它是Zope实例的数据库,ZODB文件).
这个文件每天都变化不大,但我知道Bacula无法对增量备份进行内部细分.无论如何,没关系.我想做的是每天进行一次完整备份,每周保留两个并完整备份,并保留其中两个.所以在任何时候我都可以在昨天,前一天,一周前和两周前得到.你认为这是个好主意吗?
我想我应该每天和每周做两个时间表.但是我应该在卷和池上有哪些数字来实现这个目标?两卷1.5GB?欢迎任何提示或指导,我不是系统管理员,我对Bacula的经验非常有限.
我在MVCStoreFront应用程序上观看Rob Connerys的网络广播,我注意到他甚至是最普通的东西,例如:
public Decimal DiscountPrice
{
get
{
return this.Price - this.Discount;
}
}
Run Code Online (Sandbox Code Playgroud)
会有一个测试像:
[TestMethod]
public void Test_DiscountPrice
{
Product p = new Product();
p.Price = 100;
p.Discount = 20;
Assert.IsEqual(p.DiscountPrice,80);
}
Run Code Online (Sandbox Code Playgroud)
虽然,我都是单元测试,但我有时想知道这种形式的测试首次开发是否真的有益,例如,在实际过程中,您的代码上方有3-4层(业务请求,需求文档,架构文档) ,实际定义的业务规则(折扣价格是价格 - 折扣)可能被错误定义.
如果是这种情况,您的单元测试对您来说毫无意义.
此外,您的单元测试是另一个失败点:
[TestMethod]
public void Test_DiscountPrice
{
Product p = new Product();
p.Price = 100;
p.Discount = 20;
Assert.IsEqual(p.DiscountPrice,90);
}
Run Code Online (Sandbox Code Playgroud)
现在测试存在缺陷.显然,在一个简单的测试中,这没什么大不了的,但是我们说我们正在测试一个复杂的业务规则.我们在这里获得了什么?
快速推进应用程序生命的两年,当维护开发人员维护它时.现在业务改变了规则,测试再次中断,一些菜鸟开发人员然后错误地修复了测试......我们现在又有了另一个失败点.
我所看到的只是更多可能的失败点,没有真正有益的回报,如果折扣价格错误,测试团队仍然会发现问题,单元测试如何保存任何工作?
我在这里错过了什么?请教我爱TDD,因为到目前为止我很难接受TDD.我也想要,因为我想保持进步,但这对我来说没有意义.
编辑:有几个人一直提到测试有助于执行规范.根据我的经验,规范也是错误的,通常是错误的,但也许我注定要在一个组织中工作,这些组织的规范是由那些不应该编写规范的人编写的.