现在找到解决方案的简短内容:
AutoFixture返回冻结模拟就好了; 我的sut也是由AutoFixture生成的,只有一个公共属性,其本地默认值对于测试非常重要,并且AutoFixture设置为新值.除了Mark的答案之外,还有很多值得学习的东西.
原始问题:
我昨天开始尝试使用AutoFixture进行我的xUnit.net测试,这些测试中包含了Moq.我希望更换一些Moq的东西或者让它更容易阅读,我特别感兴趣的是在SUT工厂容量中使用AutoFixture.
我使用Mark Seemann的一些关于AutoMocking的博客文章,并尝试从那里开始工作,但我没有走得太远.
这是我的测试看起来没有AutoFixture:
[Fact]
public void GetXml_ReturnsCorrectXElement()
{
// Arrange
string xmlString = @"
<mappings>
<mapping source='gcnm_loan_amount_min' target='gcnm_loan_amount_min_usd' />
<mapping source='gcnm_loan_amount_max' target='gcnm_loan_amount_max_usd' />
</mappings>";
string settingKey = "gcCreditApplicationUsdFieldMappings";
Mock<ISettings> settingsMock = new Mock<ISettings>();
settingsMock.Setup(s => s.Get(settingKey)).Returns(xmlString);
ISettings settings = settingsMock.Object;
ITracingService tracing = new Mock<ITracingService>().Object;
XElement expectedXml = XElement.Parse(xmlString);
IMappingXml sut = new SettingMappingXml(settings, tracing);
// Act
XElement actualXml = sut.GetXml();
// Assert
Assert.True(XNode.DeepEquals(expectedXml, actualXml));
}
Run Code Online (Sandbox Code Playgroud)
这里的故事很简单 - 确保使用正确的密钥(这是硬编码/属性注入)SettingMappingXml查询ISettings依赖关系并将结果返回为XElement.在 …
我正在使用Autofixture作为SUT工厂,并且在冻结空实例时遇到困难.
我想做点什么:
_fixture.Freeze<IPayPalConfiguration>(c => null);
Run Code Online (Sandbox Code Playgroud)
但很快意识到这是错误的.我使用这个解决了这个问题:
_fixture.Inject((IMyInterface)null);
Run Code Online (Sandbox Code Playgroud)
但它似乎不对.
希望有人能为HiveMind贡献正确的解决方案.
是否可以让 xUnit 创建的 ITestOutputHelper 在 AutoFixture 上下文中可用?
在我的集成测试中,我使用 Builder 类,其中包含一些常规操作的辅助方法。为了隐藏类创建的复杂性,我使用自定义 AutoDataAttribute,因此我的测试将创建对象作为来自 AutoFixture 的测试方法参数。
现在我决定向 Builder 添加一些日志记录功能,但不知道如何将 ITestOutputHelper 从自定义 AutoDataAttribute 传递到 Builder 构造函数中。
using Ploeh.AutoFixture;
using Ploeh.AutoFixture.AutoNSubstitute;
using Ploeh.AutoFixture.Xunit2;
using Xunit;
using Xunit.Abstractions;
namespace XunitAutoFixtItestOutput
{
public class Class1Tests
{
private readonly ITestOutputHelper _output;
public Class1Tests(ITestOutputHelper output)
{
_output = output;
}
[Theory, DefaultAutoData]
public void UnitOfWork_StateUnderTest_ExpectedBehavior(Builder builder)
{
}
}
public class Builder
{
private readonly ITestOutputHelper _outputHelper;
public Builder(ITestOutputHelper outputHelper)
{
_outputHelper = outputHelper;
}
public void DoSomething()
{ …Run Code Online (Sandbox Code Playgroud) 我们有一个枚举:
enum Letters
{
A,
B,
C,
D,
E
}
Run Code Online (Sandbox Code Playgroud)
当我尝试:
var frozenLetter = fixture.Freeze(Letters.D);
Run Code Online (Sandbox Code Playgroud)
奇怪的是,frozenLetter == A.
var letter = fixture.Create<Letters>();
var anotherLetter = fixture.Create<Letters>();
Run Code Online (Sandbox Code Playgroud)
Letter和anotherLetter都等于A,所以Letters类型已被冻结,但是枚举中的第一个常量而不是指定的那个.
有没有办法将枚举冻结到我希望的常量?
我希望通过使用AutoFixture和NSubstitue,我可以使用每个人提供的最好的东西.我自己使用NSubstitute取得了一些成功,但我对如何将它与AutoFixture结合使用感到困惑.
我的下面的代码显示了我想要完成的一系列事情,但我的主要目标是完成以下场景:测试方法的功能.
Data.Execute并确认结果我想要尝试的测试是:"should_run_GetCommand_with_provided_property_value"
任何有关如何使用NSubstitue和AutFixture的文章的帮助或参考都会很棒.
示例代码:
using FluentAssertions;
using NSubstitute;
using Ploeh.AutoFixture;
using Ploeh.AutoFixture.AutoNSubstitute;
using Xunit;
namespace RemotePlus.Test
{
public class SimpleTest
{
[Fact]
public void should_set_property_to_sepecified_value()
{
var sut = Substitute.For<ISimple>();
sut.Data.Returns("1,2");
sut.Data.Should().Be("1,2");
}
[Fact]
public void should_run_GetCommand_with_provided_property_value()
{
/* TODO:
* How do I create a constructor with AutoFixture and/or NSubstitute such that:
* 1. With completely random values.
* 2. With one or more values specified.
* 3. …Run Code Online (Sandbox Code Playgroud)