小编Unk*_*own的帖子

如何在单元测试中模拟DateTime.Now?

通常的解决方案是将其隐藏在界面后面.

public class RecordService
{
    private readonly ISystemTime systemTime;

    public RecordService(ISystemTime systemTime)
    {
        this.systemTime = systemTime;
    }

    public void RouteRecord(Record record)
    {
        if (record.Created < 
            systemTime.CurrentTime().AddMonths(-2))
        {
            // process old record
        }

        // process the record
    }
}
Run Code Online (Sandbox Code Playgroud)

在单元测试中,您可以使用模拟对象并决定返回什么

[TestClass]
public class When_old_record_is_processed
{
    [TestMethod]
    public void Then_it_is_moved_into_old_records_folder()
    {
        var systemTime = A.Fake<ISystemTime>();
        A.CallTo( () => system.Time.CurrentTime())
          .Returns(DateTime.Now.AddYears(-1));

        var record = new Record(DateTime.Now);
        var service = new RecordService(systemTime);

        service.RouteRecord(record);

        // Asserts...
    }
}
Run Code Online (Sandbox Code Playgroud)

我不想在我的课程中注入另一个界面来获取当前时间.对于如此小的问题,感觉太重了.解决方案是使用具有公共功能的静态类.

public static class SystemTime
{
    public …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing mocking

8
推荐指数
1
解决办法
1万
查看次数

如何在Silverlight 4中使用TextBox.Watermark?

在浏览MSDN文档时,您可能会遇到这样的gem:TextBox.Watermark.

"太棒了!我一直想要一种内置的方法在我的文本框上做水印!这很棒,让我继续在XAML中设置它!"

<TextBox Watermark="This is my watermark" Margin="20"></TextBox>
Run Code Online (Sandbox Code Playgroud)

不幸的是,如果你运行它,你将得不到你所期望的:

在此输入图像描述

细节: 在此输入图像描述

这是什么?好吧,仔细查看MSDN文档: 在此输入图像描述

那就对了.Silverlight 4支持它,但它也说"不要在Silverlight 4应用程序中使用".如果您使用它,则会收到System.NotImplemented异常.要验证,这里是通过Reflector反编译的属性的代码:

[EditorBrowsable(EditorBrowsableState.Never)]
public object Watermark
{
get
{
StubHelper.ThrowIfNotInDesignMode();
return base.GetValue(WatermarkProperty);
}
set
{
StubHelper.ThrowIfNotInDesignMode();
base.SetValue(WatermarkProperty, value);
}
}
Run Code Online (Sandbox Code Playgroud)

它就是 - 它在任何时候都没有处于设计模式时抛出异常.这没有道理吗?为什么微软会这样做?

不幸的是我还没有找到任何确定的答案,但是如果我不得不猜测是因为微软计划在未来的版本(也许是v5)中在TextBox控件上实现Watermark行为,并希望有效地保留这个属性,以便第三方控制创建者不会将TextBox子类化并创建自己的Watermark属性.我知道至少有一个控件供应商ComponentOne,它拥有一个继承自TextBox并提供Watermark属性的控件.对我来说,似乎这是微软劝阻人们在自己的TextBox子类上使用这个属性名称的方式.

.net silverlight-4.0

8
推荐指数
1
解决办法
6564
查看次数

如何访问jquery内部数据?

正如您可能或可能不知道jQuery 1.7一样,整个事件系统是从头开始重写的.代码库要快得多,并且使用新的.on()方法,为事件处理程序的连接提供了很多一致性.

一个曾经能够访问内部事件数据并研究在任何给定元素上注册的事件,但最近这个内部信息已根据以下场景隐藏...

似乎"私有"数据总是存储在.data(jQuery.expando)上 - 对于"对象",删除对象也应删除其缓存,这是有道理的.

但是,在节点领域,我认为我们应该将这些"私有"成员存储在一个单独的(私有)缓存中,这样它们就不会污染$ .fn.data()返回的对象.

虽然我同意上述更改以隐藏内部数据,但我发现访问此信息可能有助于调试和单元测试.

在jQuery 1.7中获取内部jquery事件对象的新方法是什么?

.net javascript asp.net jquery web-services

5
推荐指数
1
解决办法
711
查看次数

ValueTypes的数组不喜欢object.Equals?

这让我把头发拉了几天:

byte[] _A = new byte[64];
// Fill _A with some meaningful, valid data.

byte[] _B = new byte[_A.Length];
_A.CopyTo( _B, 0 );

if( !_A.Equals( _B ) ) {
    throw new WtfException(
        "It appears object.Equals doesn't work on arrays of value types...");
}
Run Code Online (Sandbox Code Playgroud)

是的,抛出了WtfException.我花了几天时间才注意到.byte是一个ValueType.但是,byte[]System.Array一个参考类型.根据.NET文档:

Equals的默认实现支持引用类型的引用相等,以及值类型的按位相等.引用相等意味着被比较的对象引用引用相同的对象.按位相等意味着被比较的对象具有相同的二进制表示.

有人可以帮忙吗?

c# arrays

3
推荐指数
1
解决办法
130
查看次数