以下是我当前遇到的问题的一个最小示例:
using System.Net.WebSockets;
using AutoFixture;
using AutoFixture.AutoMoq;
using FluentAssertions;
using Xunit;
...
[Fact]
public void Test1()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization() { ConfigureMembers = true });
var sut = fixture.Create<WebSocket>();
sut.Should().NotBeNull();
}
[Fact]
public void Test2()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization() { ConfigureMembers = true });
var sut = new Mock<WebSocket>().Object;
fixture.Inject(sut);
sut.Should().NotBeNull();
}
...
Run Code Online (Sandbox Code Playgroud)
当我运行第一个测试时,出现以下异常:
AutoFixture.ObjectCreationExceptionWithPath : AutoFixture was unable to create an instance from Moq.Mock`1[System.IO.Stream] because creation unexpectedly failed with exception. Please refer to …
Run Code Online (Sandbox Code Playgroud) 与 AutoFixture 4.8.0 一样,是否有更好的替代方法来使用Fixture.Register
注册函数来创建仅公开internal
构造函数的类型?
我正在开发一个 .net 标准类库来构建供内部使用的 API。我们不想公开公共构造函数,因此这些模型的所有构造函数都是internal
. 属性是另外的public readonly
。这些类将通过 Json 反序列化进行实例化,在这个特定的库中,有一个需要考虑超过 20 个属性的模型。作为奖励,我们希望尽可能使用 [AutoDataAttribute]。
IE。是否有其他方法可以使用 AutoFixture 提供具有 20 多个参数的非类型和复杂类型(也是内部)混合的内部 json 构造函数?
[TestFixture]
public sealed class Tests
{
private Fixture _fixture;
[OneTimeSetUp]
public void OneTimeSetup()
{
_fixture = new Fixture();
_fixture.Register(() => new Vehicle(_fixture.Create<string>(), _fixture.Create<int>()));
_fixture.Register(
() => new Driver(_fixture.Create<string>(), _fixture.Create<int>(), _fixture.Create<Vehicle>()));
}
[Test]
public void CanCreateDriverWithVehicle()
{
Func<Driver> func = () => _fixture.Create<Driver>();
func.Should().NotThrow(); // Green
}
}
[PublicAPI]
public …
Run Code Online (Sandbox Code Playgroud) 目前,我正在使用定制的假对象,这些对象在幕后使用 NSubstitute 创建实际对象,但随着项目的发展,它变得非常难以维护,所以我正在尝试寻找替代方案,我希望 AutoFixture 是适合这项工作的工具。
我阅读了文档,但我很挣扎,因为文档很少甚至没有,而且我阅读了 Mark Seemann 的大部分博客文章,包括 CheatSheet。
我很难掌握的一件事是如何使用带有参数的构造函数创建一个对象,在我的例子中,我需要将参数传递给 CsEmbeddedRazorViewEngine 以及将 HttpRequestBase 传递给 ControllerContext。
我的看法是,我需要创建一个假对象,最后创建一个将它们注入到的自定义对象
我还研究了 NBuilder,在那里传递参数似乎稍微微不足道,但我听说过有关 AutoFixture 的好消息,我想尝试一下。:)
我正在尝试减少假物体的数量,所以这是一个真正的测试,我如何使用 AutoFixture 做同样的事情?
[Theory,
InlineData("en-US"),
InlineData("en-us"),
InlineData("en")]
public void Should_return_the_default_path_of_the_view_for_enUS(string language)
{
// Arrange
const string EXPECTED_VIEW_PATH = "~/MyAssemblyName/Views/Home/Index.cshtml";
CsEmbeddedRazorViewEngine engine = CsEmbeddedRazorViewEngineFactory.Create(ASSEMBLY_NAME, VIEW_PATH, string.Empty);
string[] userLanguage = { language };
HttpRequestBase request = FakeHttpRequestFactory.Create(userLanguage);
ControllerContext controllerContext = FakeControllerContextFactory.Create(request);
// Act
ViewEngineResult result = engine.FindPartialView(controllerContext, VIEW_NAME, false);
// Assert
RazorView razorView = (RazorView)result.View;
string actualViewPath = razorView.ViewPath;
actualViewPath.Should().Be(EXPECTED_VIEW_PATH);
} …
Run Code Online (Sandbox Code Playgroud) 我需要告诉 AutoFixture 它生成的所有随机日期都应该在一定限制内,或者例如等于 Now。我只想设置 Fixture 实例的行为,以便它适用于整个代码中的所有用例,我不想单独检查。
我如何配置 AutoFixture 来做到这一点?
该模型具有属性等Id
。Code
我想用特定的不同代码创建 4 个数据。
var data = _fixture.Build<MyModel>()
.With(f => f.Code, "A")
.CreateMany(4);
Run Code Online (Sandbox Code Playgroud)
这将产生所有 4 个数据均带有代码“A”。我想要 4 个数据的代码为“A”、“B”、“C”、“D”
提前致谢
我有课Alias
。我已经将它与 Autofixture 一起使用,一切正常。然而,当我向我的类添加接口属性时,测试开始失败。
这就是我的课:
public class Alias : NotifyPropertyChanged
{
private Alias()
{
Nicks = new List<string>();
History = new History(this);
}
public IDownloader Downloader {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我在测试中使用它是这样的:
Fixture fixture = new Fixture();
var alias = fixture.Create<Alias>();
Run Code Online (Sandbox Code Playgroud)
并得到异常:
loeh.AutoFixture.ObjectCreationException:AutoFixture 无法从 Core.Helpers.IDownloader 创建实例...
我尝试通过注册接口,fixture.Register<IVKDownloader>(() => new Downloader());
但仍然收到此错误。
如果我更改此属性以使用类型而不是接口,public Downloader Downloader {get;set;}
一切都会正常工作。我该如何解决这个问题?