使用bUnit和Moq测试使用Fluxor的剃须刀组件



我在Blazor应用程序中的一个剃须刀组件中使用Fluxor进行状态管理,我真的不知道如何设置它以使用Moq进行测试。我不能仅仅把一个值传给学生,因为它是一个仅初始化的属性。有没有一种特定的方法来设置Fluxor进行测试?

代码

var teacherService = new Mock<ITeacherService>();
var  localStorage = new Mock<ILocalStorageService>();
var  studentService = new Mock<IStudentService>();
var  toastService = new Mock<IToastService>();
var  NavigationManager = new Mock<NavigationManager>();
var  Dispatcher = new Mock<IDispatcher>();
var actionSubscriber = new Mock<IActionSubscriber>();
var StudentsState = new Mock<IState<StudentsState>>();
var TeacherState = new Mock<IState<TeacherState>>();
// Help here
StudentsState.Setup(t => t.Value.Students = )

我在这个问题上坚持了很长一段时间,但浏览了Fluxor的闪光社区,发现了一些可能有帮助的东西!我知道你想使用Moq进行测试,但也许我发现的可能更容易/适合你测试Fluxor组件的目的!

我没有使用Moq,而是遵循了这种格式,并设法实现了一些功能:

测试.cs

public class InhousePetOwnerStateTests
{
private readonly IServiceProvider ServiceProvider;
private readonly IStore Store;
private readonly IState<InhousePetOwnerListState> State;
public InhousePetOwnerStateTests()
{
var services = new ServiceCollection();
services.AddFluxor(x =>
x
.ScanAssemblies(GetType().Assembly)
.ScanTypes(typeof(InhousePetOwnerListState), typeof(Reducers)));

ServiceProvider = services.BuildServiceProvider();
Store = ServiceProvider.GetRequiredService<IStore>();
State = ServiceProvider.GetRequiredService<IState<InhousePetOwnerListState>>();
Store.InitializeAsync().Wait();
}
[Fact]
public void SetInhousePetOwnerList_Empty_StateUpdated()
{
Store.Dispatch(new SetInhousePetOwnerListAction(new()));
Assert.Empty(State.Value.InhousePetOwners);
}

[Fact]
public void SetInhousePetOwnerList_MultipleInhouseOwners_StateUpdated()
{
List<InhousePetOwner> inhousePetOwners = new List<InhousePetOwner>
{
new InhousePetOwner()
{
InhousePetOwnerId = 1,
PetOwnerId = 1,
TimeIn = System.DateTime.Now
},
new InhousePetOwner()
{
InhousePetOwnerId = 2,
PetOwnerId = 2,
TimeIn = System.DateTime.Now
},
};
Store.Dispatch(new SetInhousePetOwnerListAction(inhousePetOwners));
Assert.Equal(2, State.Value.InhousePetOwners.Count);
}
}

在构造函数中,我们创建一个服务集合并添加Fluxor(就像您在Startup.cs中一样(,然后扫描程序集。

在上面的代码中,我扫描了Reducers和State。请参考我的目录结构(你会知道我是如何决定包含什么的(。

Actions.cs

public class SetInhousePetOwnerListAction
{
public List<InhousePetOwner> InhousePetOwners { get; }
public SetInhousePetOwnerListAction(List<InhousePetOwner> inhousePetOwners)
{
InhousePetOwners = inhousePetOwners;
}
}

Reducers.cs(在构造函数中扫描(

public static class Reducers
{
[ReducerMethod]
public static InhousePetOwnerListState ReduceSetInhousePetOwnerListAction(InhousePetOwnerListState state, SetInhousePetOwnerListAction action)
{
return new InhousePetOwnerListState(inhousePetOwners: action.InhousePetOwners);
}
}

InhousePetOwnerState.cs(在构造函数中扫描(

public class InhousePetOwnerListState
{
public List<InhousePetOwner> InhousePetOwners { get; }
private InhousePetOwnerListState() { }
public InhousePetOwnerListState(List<InhousePetOwner> inhousePetOwners)
{
InhousePetOwners = inhousePetOwners;
}
}

这个解决方案的作用是,它允许您注入所有Fluxor状态、操作和减少程序,使您能够像往常一样调用它们——我发现用这种方式测试非常容易!

我这样做的方式是使用设置返回整个状态记录,并按照我想要的方式进行配置。

因此,如果你有一个学生状态为只读的IState

你可以做:

var studentState = new Mock<IState<StudentsState>>();
studentState.Setup(s => s.Value)
.Returns(
new StudentsState 
{ 
Students = new List<StudentRecord> 
{ ... }
});

最新更新