小编bit*_*onk的帖子

将MSpec测试转换为普通NUnit

我正在尝试开始使用纯TDD并考虑BDD风格.我试图掌握,与MSpec相比,写作单元测试的感觉与NUnit完全不同.

考虑一个简单的MSpec测试,如下所示:

[Subject("PersonRepository")]
class when_adding_a_new_person
{
     Establish context = () => sut = new PersonRepository();

     Because of = () => sut.AddPerson("Jim", "Panse");

     It should_have_a_person = sut.Count.ShouldEqual(1);
     It should_have_that_persion = sut.Contains("Jim", "Panse");

     static PersonRepository;
} 
Run Code Online (Sandbox Code Playgroud)

你如何以干净的方式将其转换为NUnit,但不使用任何BDD扩展或任何东西.我认为每个应该断言是一个可单独运行的测试Establish并且 Because应该只对所有断言执行一次是个好主意.我可以使用[Setup]EstablishBecause,但会为每个测试运行.我可以用Assert.It,但是这不会让他们单独运行的测试.

这个例子与NUnit风格相比如何?

tdd bdd comparison nunit mspec

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

数据绑定总是编组到UI线程吗?

绑定到Silverlight 3和4中的属性时,Windows Phone 7版本的Silverlight和WPF 3.5和4中的属性更改通知是否总是被编组到UI线程?您是否知道我不能依赖它的任何场景,并且必须在我的代码中进行编组操作?

data-binding silverlight wpf multithreading ui-thread

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

强制NLog创建年,月,日的新日志文件夹

如何使用此模式"$ {yyyy}/$ {MM}/$ {dd}/log $ {yyMMdd}.$ {####}.txt"强制NLog写入日志文件?

为每年,每月,每天创建一个新目录,并使文件名包含时间和运行数字(4位数宽),例如log192412.0001.txt(如果超出文件大小(在新的一天开始之前)).

configuration nlog

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

这个MSpec测试可以改进吗?

作为BDD和MSpec的初学者,我仍然不太了解与BDD相关的最佳实践和良好习惯,特别是MSpec.

可以改进以下示例吗?它遵循最佳做法和良好习惯吗?

  1. 是我的规范类和行为的命名好吗?
  2. 我应该在这种情况下使用行为还是应该为spec类使用公共基类?
  3. 可以没有Establish这里吗?
  4. 我应该使用静态工厂方法(TestData方法)来获取测试数据还是应该在规范本身中创建数据?
  5. 而不是测试我可以使用的行为中的每个属性,result.Equals()但我会测试两件事,这是不好的,对吧?

请随意将示例重构为您认为更好的内容.

[Subject(typeof(DataItemReader))]
public class When_reading_a_DataItem_from_stream
{
    Because of = () =>
    {
        using (var reader = new DataItemReader(
            new MemoryStream(TestData.GetNormalDataItemAsByteArray()), Encryption.None))
        {
            result = reader.ReadItem();
        }
    };

    Behaves_like<DataItemReader_that_reads_correctly> behavior;

    protected static DataItem result;
}

[Subject(typeof(DataItemReader))]
public class When_reading_a_DataItem_from_encrypted_stream
{
    Because of = () =>
    {
        using (var reader = new DataItemReader(
            new MemoryStream(TestData.GetNormalDataItemAsByteArrayEncyrpted()), Encryption.Default))
        {
            result = reader.ReadItem();
        }
    };

    Behaves_like<DataItemReader_that_reads_correctly> behavior;

    protected static DataItem result;
} …
Run Code Online (Sandbox Code Playgroud)

bdd mspec

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

WPF TreeView水平方向?

什么是改变WPF树视图方向的麻烦方式.我想使用expand-collapse功能从左到右而不是从上到下工作.即当我点击treenode的展开按钮时,我的子节点将显示在父节点右侧,缩进应该自上而下.此外,连接节点的垂直线现在必须是水平的.

wpf treeview

2
推荐指数
1
解决办法
6834
查看次数

是什么让CLR显示断言?

如果我在visual studio中为我的C#项目定义了Debug常量,我可以确定将评估断言并在失败时显示消息框.但是什么标志属性使CLR在运行时实际上决定是否评估和显示断言.在定义DEBUG时,断言代码是否不会在IL中结束?或者它是程序集的DebuggableAttribute中的DebuggableAttribute.DebuggingModes标志的关键点?如果是这样,它的枚举值必须存在?这是如何工作的?

.net debugging clr assertions

2
推荐指数
1
解决办法
248
查看次数

我的datatrigger绑定有什么问题?

我创建了一个附加属性来扩展具有附加状态的Button类:

<Button v:ExtensionHelper.OperationMode="{Binding MyObject.OperationMode}" 
        Command="{Binding MyObject.Select}" 
        Style="{StaticResource operationModeControlTemplateStyle}" />
Run Code Online (Sandbox Code Playgroud)

然后,我想在访问此值,ControlTemplate使用DataTrigger这样的:

<Style x:Key="operationModeControlTemplateStyle" TargetType="Button">
    <Setter Property="IsHitTestVisible" Value="true" />        
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Grid>
                    <Image x:Name="hand" Source="hand.png" />
                    <Image x:Name="cross" Source="cross.png" />
                </Grid>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding Path=(v:ExtensionHelper.OperationMode), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Value="Manual">
                        <Setter TargetName="cross" Property="Visibility" Value="Collapsed" />
                        <Setter TargetName="hand" Property="Visibility" Value="Visible" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=(v:ExtensionHelper.OperationMode), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Value="Disabled">
                        <Setter TargetName="cross" Property="Visibility" Value="Visible" />
                        <Setter TargetName="hand" Property="Visibility" Value="Collapsed" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=(v:ExtensionHelper.OperationMode), RelativeSource={RelativeSource FindAncestor, …
Run Code Online (Sandbox Code Playgroud)

data-binding wpf datatrigger controltemplate attached-properties

2
推荐指数
1
解决办法
7132
查看次数

运行涵盖此方法/类的所有测试

在对方法进行更改后,我反复做的一件事是,我很快就想运行涵盖此方法的所有测试.

你知道一个工具给我这个按钮/菜单条目吗?运行影响此方法的测试运行影响此类的测试

我安装了dotCover和ReShaper,但我没有看到任何类似的选项.

我知道有像NCrunch或Mighty Moose这样的连续测试工具,它们在后台不断运行我的所有测试,但我不确定我是否准备好了.

c# tdd resharper unit-testing dotcover

2
推荐指数
1
解决办法
263
查看次数

WPF 滑块设计

我想使用这样的滑块 像这样

我希望该滑块根据提供给它的值进行相应调整。到目前为止,我只能应用具有渐变效果的背景,但无法获得这种效果。请通过向我提供样式代码来帮助我。

<Slider>
   <Slider.Background>
      <LinearGradientBrush EndPoint="1,0.5" StartPoint="0,0.5">
         <GradientStop Color="Red" Offset="0"/>
         <GradientStop x:Name="WhiteOffset" Color="Yellow" Offset="0.5"/>
         <GradientStop x:Name="GrayOffset" Color="Red" Offset="1"/>
      </LinearGradientBrush> 
   </Slider.Background>
</Slider>
Run Code Online (Sandbox Code Playgroud)

谢谢。

wpf xaml

2
推荐指数
1
解决办法
1907
查看次数

我应该总是完成一个TaskCompletionSource吗?

a TaskCompletionSource和它Task如果TaskCompletionSource永远不会完成会发生什么(即SetCancelled,SetException或者SetResult永远不会被调用?它会Task永远存在,因为它永远不会完成吗?

在下面的例子中,我有一个参数化测试的简化版本.如果超时(MyEevent未在1000毫秒内调用),则TaskCompletionSource(tcs)永远不会完成.我有很多像这样的测试.我是否需要进行任何类型的清理(例如,确保调用tcs.SetCancelled()).

[Theory]
[InlineData("aa")]
[InlineData(2)]
[InlineData(true)]
[InlineData(null)]
public async Task RaiseMyEvent_RaisesMyEvent_WithOriginalValue(object value)
{
    var sut = new Thing();
    var tcs = new TaskCompletionSource<object>();
    sut.MyEvent += (_, args) => tcs.SetResult(args.Value);

    sut.RaiseMyEvent(value);

    tcs.Task.Should().BeSameAs(await Task.WhenAny(Task.Delay(1000), tcs.Task), "MyEvent should be raised within 1000ms");
    tcs.Task.Result.Should().Be(value);
}
Run Code Online (Sandbox Code Playgroud)

虽然我们在这里,有什么方法可以改进上面的测试(例如,使它更简洁/简单/可读)?

c# task-parallel-library async-await taskcompletionsource

2
推荐指数
1
解决办法
715
查看次数