gpt4 book ai didi

wpf - 有没有更好的方法来测试此MVVM Light消息,该消息不会引起偶尔的线程错误?

转载 作者:行者123 更新时间:2023-12-03 10:17:39 26 4
gpt4 key购买 nike

我的 View 模型中有一个属性,其唯一的工作就是在更改属性时发出一条消息。我想对它确实在做它的工作进行单元测试,所以我编写了以下测试

[TestFixture, RequiresSTA]
public class ToolBarViewModelTests
{
private SecondaryScalingMode _SecondaryScalingMode;

private void RecordSecondaryScalingSetting(SecondaryScalingMode obj)
{
_SecondaryScalingMode = obj;
}

[Test]
public void AssertCombineAllCornersScalingMessageIsSent()
{
var vm = CreateNewToolBar();

_SecondaryScalingMode = SecondaryScalingMode.IndividualCorner;

AppMessages.SetSecondaryScalingMode.Register(this, (Action<SecondaryScalingMode>)RecordSecondaryScalingSetting);

vm.CombineAllCornersScaling = true;
Assert.IsFalse(vm.IndividualCornerScaling);
Assert.IsFalse(vm.LeftRightScaling);
Assert.IsFalse(vm.FrontRearScaling);
Assert.IsTrue(vm.CombineAllCornersScaling);
Assert.AreEqual(SecondaryScalingMode.CombineAllCorners, _SecondaryScalingMode);
}
}

该测试可以断言正确的行为,但是由于线程错误,它有时会在本地和我的构建服务器上失败。错误如下
Test(s) failed. System.Reflection.TargetInvocationException : Exception has been thrown         by the target of an invocation.  
----> System.InvalidOperationException : The calling thread cannot access this object because a different thread owns it.
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)

有没有更好的方法可以编写此测试,从而防止它以这种方式随机失败?

最佳答案

好的,这是我通常采用的方法。这与您所做的非常接近。
请注意,您还可以劫持Messenger,并在单元测试中订阅Messenger。

我发布了代码的简化版本以匹配示例。

我以前在单元测试中还偶尔出现一些奇怪的错误,这是时间/线程问题。

为此,它有助于重置Messenger foreach单元测试...

这是viewmodel(简化的猜测工作=)...):

public class UnitTestViewModel:ViewModelBase
{
public UnitTestViewModel()
{
Messenger.Default.Register<string>(this, "SetSecondaryScalingMode", (message) =>
{
UpdateScalingMode();
});
}

private bool _CombineAllCornersScaling;
public bool CombineAllCornersScaling
{
get {
return _CombineAllCornersScaling;
}
set {
_CombineAllCornersScaling = value;
Messenger.Default.Send<string>("update", "SetSecondaryScalingMode");
RaisePropertyChanged("CombineAllCornersScaling");
}
}

private bool _IndividualCornerScaling;
public bool IndividualCornerScaling
{
get
{
return _IndividualCornerScaling;
}
set
{
_IndividualCornerScaling = value;

RaisePropertyChanged("IndividualCornerScaling");
}
}

private bool _LeftRightScaling;
public bool LeftRightScaling
{
get
{
return _LeftRightScaling;
}
set
{
_LeftRightScaling = value;

RaisePropertyChanged("LeftRightScaling");
}
}

private bool _FrontRearScaling;
public bool FrontRearScaling
{
get
{
return _FrontRearScaling;
}
set
{
_FrontRearScaling = value;

RaisePropertyChanged("FrontRearScaling");
}
}

private void UpdateScalingMode()
{
IndividualCornerScaling = false;
LeftRightScaling = false;
FrontRearScaling = true;
}
}

这是单元测试(使用MSTest,但可以应用于其他软件包)...
 [TestMethod]
public void UpdaetScalingMode()
{
Messenger.Reset();
var vm = new UnitTestViewModel();
bool updateMessageWasSend = false;
string _thisCanBeTheObjectYouWerePassing = String.Empty;
Messenger.Default.Register<string>(vm, "SetSecondaryScalingMode", (msg) =>
{
_thisCanBeTheObjectYouWerePassing = msg;
updateMessageWasSend = true;
});

vm.CombineAllCornersScaling = true;

Assert.AreEqual(true, updateMessageWasSend);
Assert.AreEqual(false, vm.IndividualCornerScaling);
Assert.AreEqual(false, vm.LeftRightScaling);
Assert.AreEqual(true, vm.CombineAllCornersScaling);
Assert.AreEqual("update", _thisCanBeTheObjectYouWerePassing);

}

Rember只是为了说明这个概念。

我确实为消息有效负载传递了一个字符串,但是使用所有Messenger功能,它可能会像您想要的那样复杂。

我希望这会有所帮助...否则,如果将ViewModel代码与另一种测试策略结合起来会有所帮助...

附注:我也养成了习惯,每个测试仅拥有1个断言,而改写更多的测试...

关于wpf - 有没有更好的方法来测试此MVVM Light消息,该消息不会引起偶尔的线程错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com