使用这种结构。
public class User
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public virtual bool IsAdministrator()
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
是否可以组合AutoFixture并Moq完成以下任务?
User.FirstName是自动生成的User.LastName始终为“Smith”(字面意思)User.MiddleName未填充(默认)TrueIsAdministrator()已调用验证。我知道这看起来很简单。这是我尝试使用的AutoMoq。
var config = new AutoMoqCustomization()
{
ConfigureMembers = true
};
var fixture = new AutoFixture.Fixture();
fixture.Customize(config);
fixture.Freeze<Mock<User>>()
.Setup(x => x.IsAdministrator())
.Returns(true);
var …Run Code Online (Sandbox Code Playgroud) 我面临着与一个奇怪的问题AutoFixture,并AutoMoqCustomization和它如何与具体类的automocking交易.我怀疑我没有很好地使用它,但想知道问题是什么.首先是她的一些背景.假设我有一个我想测试的课程:
public class IdentityApplicationService
{
public IdentityApplicationService(
TenantProvisioningService tenantProvisioningService)
{
// guard clause etc.
_tenantProvisioningService = tenantProvisioningService;
}
}
Run Code Online (Sandbox Code Playgroud)
及其依赖类TenantProvisioningService(TenantProvisioningService的依赖项在这里不相关,因为它们将被自动模拟,我在测试时并不关心):
public class TenantProvisioningService
{
readonly IRoleRepository _roleRepository;
readonly ITenantRepository _tenantRepository;
readonly IUserRepository _userRepository;
public TenantProvisioningService(
ITenantRepository tenantRepository,
IUserRepository userRepository,
IRoleRepository roleRepository)
{
this._roleRepository = roleRepository;
this._tenantRepository = tenantRepository;
this._userRepository = userRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的简单测试:
[Fact]
public void ShouldReturnTenantWhenCallingProvisionTenant()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var mockTenantProvisioningService =
fixture.Freeze<Mock<TenantProvisioningService>>();
var sut = fixture.Create<IdentityApplicationService>();
var …Run Code Online (Sandbox Code Playgroud) 我目前正在使用一个测试框架,该框架是我使用 xUnit、AutoMoq、AutoFixture 和 AutoFixture.XUnit2 组合而成的。我遇到了使用通用签名的模拟方法的问题。
AutoFixture 似乎可以很好地处理通用项目。如果我要求一个CustomeObject<Task<List<Task<string>>>>或其他一些荒谬的嵌套泛型类型,它似乎会按预期生成它们,一直到最后一个节点。
但是,如果我有这样的界面:
public interface ITestInterface{
T Get<T>();
}
Run Code Online (Sandbox Code Playgroud)
然后尝试从我从 AutoMoq 获得的模拟中调用该方法,它只返回 null。因此,例如:
[Theory]
[MyAutoDaqaAttribute]
public async Task ATest(
Mock<ITestInterface> service
) {
var result = service.Object.Get<string>();
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,结果将为空。这对我来说似乎很奇怪。难道它不应该转到 autofixture 并尝试创建 T 类型的值(即新字符串)吗?看起来 Autofixture 已经表明它可以很好地处理泛型。
或者您是否总是需要手动设置任何签名中具有泛型的模拟方法?
我有一个简单的ViewModel,它包含一些按钮.使用PaP Prism的EventAggregator引发的事件可以更改这些按钮的可见性,这也是此VM的唯一构造函数参数.当我不使用AutoFixture时,相应的测试工作正常.
[Theory]
[InfrastructureAutoData]
public void AllButtonsAreShownWhenVisibilityStatusIsSet(
[Frozen]EventAggregator eventAggregator,
ActionBarViewModel sut)
{
eventAggregator
.GetEvent<ActionButtonActivationEvent>()
.Publish(VisibleActionButtons.All);
sut.CancelButtonVisibility.Should().Be(Visibility.Visible);
sut.BackButtonVisibility.Should().Be(Visibility.Visible);
sut.NextButtonVisibility.Should().Be(Visibility.Visible);
sut.Visiblity.Should().Be(Visibility.Visible);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,它不像这里给出的那样起作用,因为AutoFixture注入ViewModel的EventAggregator实例是另一个实例,而不是注入测试的实例.
public class InfrastructureAutoData : AutoDataAttribute
{
public InfrastructureAutoData()
{
Initialize();
}
private void Initialize()
{
this.Fixture.Customize(new AutoMoqCustomization());
Fixture.Register<IEventAggregator>(() => new EventAggregator());
}
}
public class ActionBarViewModel
{
public ActionBarViewModel(IEventAggregator eventAggregator)
{
eventAggregator.GetEvent<ActionButtonActivationEvent>()
.Subscribe(ActivateButtons);
ActivateButtons(VisibleActionButtons.None);
}
/// <summary>
/// Visibility of a button which cancels the current action.
/// </summary>
public Visibility CancelButtonVisibility { get; private set; }
/// <summary> …Run Code Online (Sandbox Code Playgroud) 例如ISomething,一个具有三个属性的接口:string Name和int Count一些复杂的属性ImComplex(具有循环依赖性等),我不想自动构建.所以我需要AutoFixture来创建一个Mock of ISomethingwith Name并Count通过其默认算法设置并ImComplex为null.但如果我试图像这样解决它我会得到一个例外:
fixture.Customize(new AutoConfiguredMoqCustomization());
var some = fixture.Build<ISomething>().Without(x=>x.ImComplex).Create<ISomething>();
Run Code Online (Sandbox Code Playgroud)
Ploeh.AutoFixture.ObjectCreationException:装饰的ISpecimenBuilder无法根据请求创建样本:RP.Core.IInformationUnit.如果请求表示接口或抽象类,则会发生这种情况; 如果是这种情况,请注册一个可以根据请求创建标本的ISpecimenBuilder.如果在强类型的Build表达式中发生这种情况,请尝试使用其中一个IFactoryComposer方法提供工厂.
我该怎么办?
以下是我当前遇到的问题的一个最小示例:
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) 我正在尝试对使用SearchClient.SearchAsync()方法的代码进行单元测试。我正在使用 AutoFixture.AutoMoq nuget 包。
这是我尝试过的:
mockSearchClient.Setup(msc => msc.SearchAsync<MyModel>(
It.IsAny<string>(),
It.IsAny<SearchOptions>(),
It.IsAny<CancellationToken>()
)).Returns(Task.FromResult(<<PROBLEM HERE>>));
Run Code Online (Sandbox Code Playgroud)
问题出在参数.Returns(Task.FromResult(<<PROBLEM HERE>>))部分。它需要一个从.SearchAsync()方法返回的具体对象。根据文档和自动完成,该方法返回Azure.Response一个抽象类。所以,我不能更新它。实际上,该方法返回一个后代类Azure.ValueResponse,它不是抽象的,而是 Azure SDK 内部的,因此也无法更新。
那么如何模拟 SearchClient.SearchAsync 呢?
PS 使用 Azure.Search.Documents,v11.1.1.0