我正在尝试开始使用纯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]的Establish和 Because,但会为每个测试运行.我可以用Assert.的It,但是这不会让他们单独运行的测试.
这个例子与NUnit风格相比如何?
绑定到Silverlight 3和4中的属性时,Windows Phone 7版本的Silverlight和WPF 3.5和4中的属性更改通知是否总是被编组到UI线程?您是否知道我不能依赖它的任何场景,并且必须在我的代码中进行编组操作?
如何使用此模式"$ {yyyy}/$ {MM}/$ {dd}/log $ {yyMMdd}.$ {####}.txt"强制NLog写入日志文件?
为每年,每月,每天创建一个新目录,并使文件名包含时间和运行数字(4位数宽),例如log192412.0001.txt(如果超出文件大小(在新的一天开始之前)).
作为BDD和MSpec的初学者,我仍然不太了解与BDD相关的最佳实践和良好习惯,特别是MSpec.
可以改进以下示例吗?它遵循最佳做法和良好习惯吗?
Establish这里吗?TestData方法)来获取测试数据还是应该在规范本身中创建数据?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) 什么是改变WPF树视图方向的麻烦方式.我想使用expand-collapse功能从左到右而不是从上到下工作.即当我点击treenode的展开按钮时,我的子节点将显示在父节点右侧,缩进应该自上而下.此外,连接节点的垂直线现在必须是水平的.
如果我在visual studio中为我的C#项目定义了Debug常量,我可以确定将评估断言并在失败时显示消息框.但是什么标志属性使CLR在运行时实际上决定是否评估和显示断言.在定义DEBUG时,断言代码是否不会在IL中结束?或者它是程序集的DebuggableAttribute中的DebuggableAttribute.DebuggingModes标志的关键点?如果是这样,它的枚举值必须存在?这是如何工作的?
我创建了一个附加属性来扩展具有附加状态的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
在对方法进行更改后,我反复做的一件事是,我很快就想运行涵盖此方法的所有测试.
你知道一个工具给我这个按钮/菜单条目吗?运行影响此方法的测试并运行影响此类的测试?
我安装了dotCover和ReShaper,但我没有看到任何类似的选项.
我知道有像NCrunch或Mighty Moose这样的连续测试工具,它们在后台不断运行我的所有测试,但我不确定我是否准备好了.
我想使用这样的滑块 
我希望该滑块根据提供给它的值进行相应调整。到目前为止,我只能应用具有渐变效果的背景,但无法获得这种效果。请通过向我提供样式代码来帮助我。
<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)
谢谢。
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)
虽然我们在这里,有什么方法可以改进上面的测试(例如,使它更简洁/简单/可读)?
wpf ×4
bdd ×2
c# ×2
data-binding ×2
mspec ×2
tdd ×2
.net ×1
assertions ×1
async-await ×1
clr ×1
comparison ×1
datatrigger ×1
debugging ×1
dotcover ×1
nlog ×1
nunit ×1
resharper ×1
silverlight ×1
treeview ×1
ui-thread ×1
unit-testing ×1
xaml ×1