Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在方法的不同点对相同值的多个断言_C#_Unit Testing_Xamarin - Fatal编程技术网

C# 在方法的不同点对相同值的多个断言

C# 在方法的不同点对相同值的多个断言,c#,unit-testing,xamarin,C#,Unit Testing,Xamarin,我有一个任务,我正试图为它编写一个单元测试。等待任务时,我需要确保布尔值在任务开始时设置为true,然后在任务完成前设置为false。一旦任务完成,我可以很容易地测试布尔值是多少,但我需要能够在开始时测试该值 我尝试过使用fluent断言进行某种类型的事件监视,但这只会通知我属性已更新,而不是值已更新到什么 private bool _boolToTest; public bool BoolToTest { get => _boolToTest; set

我有一个任务,我正试图为它编写一个单元测试。等待任务时,我需要确保布尔值在任务开始时设置为true,然后在任务完成前设置为false。一旦任务完成,我可以很容易地测试布尔值是多少,但我需要能够在开始时测试该值

我尝试过使用fluent断言进行某种类型的事件监视,但这只会通知我属性已更新,而不是值已更新到什么

private bool _boolToTest;
public bool BoolToTest
{
    get => _boolToTest;
        set
        {
            if (SetProperty(ref _boolToTest, value))
            {
                RaisePropertyChanged(nameof(CanExecute));
            }
        }
}

public bool CanExecute => !_boolToTest;

public async Task Foo()
{
    BoolToTest = true;
    var somevalue = await _foo.Bar();
    if (something)
    {
        doSomething();
    }
    BoolToTest = false;
}

在一个完美的世界里,我可以做一些事情,比如value.Should.BeTrueThenFalse;。我基本上需要实现这一点。

您应该能够通过订阅PropertyChanged事件来测试它


为什么不在开始时断言它是错误的,然后在结束时断言你的工作呢?不过,看起来你应该在开始时将值设置为false,而不是assert。这个问题的措辞让我感到困惑。我很难理解被问到的问题。你没有展示什么是“福吧”。如果您模拟它,使Bar返回类似Task.Delay100的内容,那么您可能能够在Foo执行时监视BoolToTest的更改。但这很奇怪。这会让任何看它的人感到困惑。弄清楚如何测试它是令人困惑的,这是代码本身令人困惑的一个强有力的指标。@ScottHannen你是在告诉我这是令人困惑的。我被要求在不改变任何实现的情况下为它编写测试。这是公平的。我是说,对你不公平。有人通过编写混乱、难以测试的代码来攻击你,这就是为什么他们没有为它编写单元测试,并要求你找出如何在不改变它的情况下测试它的原因。有时这几乎是不可能的。但在这种情况下,我认为这是可能的,通过做我在前面的评论中所描述的。如果您包含一些更详细的信息-是什么东西注入到这个类中了吗我可以举个例子。
var actualValues = new List<bool> { };

var objectUnderTheTest = new MyObject();
objectUnderTheTest.PropertyChanged += (sender, args) =>
    { 
        var instance = (MyObject)sender;
        if (args.PropertyName == nameof(instance.CanExecute))
        {
            actualValues.Add(instance.BoolToTest);
        }
    }

 await objectUnderTheTest.Foo();

 var expected = new[] { true, false };

 actualValues.Should().BeEquivalentTo(expected, options => options.WithStrictOrdering());