gpt4 book ai didi

c# - 如何在 C# 中对 if-else 语句进行单元测试?

转载 作者:行者123 更新时间:2023-11-30 20:59:41 25 4
gpt4 key购买 nike

我想测试if-else语句是否执行,“if” block 从字典/缓存中返回项目并返回输出,而“else” block 将输入添加到缓存中并返回输出

带有 Apply 方法的 IModifyBehavior 接口(interface)

我有这个类(class):

namespace Decorator
{
using System;

/// <summary>
/// Reverse Behavior
/// </summary>
public class ReverseBehavior : IModifyBehavior
{
/// <summary>
/// Applies the specified value.
/// </summary>
/// <param name="value">The value.</param>
/// <returns>result</returns>
public string Apply(string value)
{
var result = string.Empty;
if (value != null)
{
char[] letters = value.ToCharArray();
Array.Reverse(letters);
result = new string(letters);
}

return result;
}
}
}




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

/// <summary>
/// Caching Decorator
/// </summary>
public class CachingDecorator : IModifyBehavior
{

/// <summary>
/// The behavior
/// </summary>
private IModifyBehavior behavior;


public CachingDecorator(IModifyBehavior behavior)
{
if (behavior == null)
{
throw new ArgumentNullException("behavior");
}

this.behavior = behavior;
}



private static Dictionary<string, string> cache = new Dictionary<string, string>();

/// <summary>
/// Applies the specified value.
/// </summary>
/// <param name="value">The value.</param>
/// <returns>
/// value
/// </returns>
public string Apply(string value)
{
////Key = original value, Value = Reversed
var result = string.Empty;

//cache.Add("randel", "lednar");
if(cache.ContainsKey(value))
{
result = cache[value];
}
else
{
result = this.behavior.Apply(value);// = "reversed";
////Note:Add(key,value)
cache.Add(value, result);
}
return result;
}
}
}

这是我目前测试的代码,代码能够通过测试,但我不确定我的实现是否正确:

[TestClass]
public class CachingDecoratorTest
{
private IModifyBehavior behavior;

[TestInitialize]
public void Setup()
{
this.behavior = new CachingDecorator(new ReverseBehavior());
}

[TestCleanup]
public void Teardown()
{
this.behavior = null;
}

[TestMethod]
public void Apply_Cached_ReturnsReversedCachedValue()
{
string actual = "randel";
////store it inside the cache
string cached = this.behavior.Apply(actual);

////call the function again, to test the else block statement
////Implement DRY principle next time
string expected = this.behavior.Apply(actual);
Assert.IsTrue(cached.Equals(expected));

}

[TestMethod]
public void Apply_NotCached_ReturnsReversed()
{
string actual = "randel";
string expected = "lednar";
Assert.AreEqual(expected, this.behavior.Apply(actual));
}


}

先生/女士,您的回答会有很大帮助。谢谢++

最佳答案

首先,我实际上会将这两个类作为适当的单元单独测试。下面我写了我将如何测试这些。为此,我使用 NUnit 和 Moq (在 Nuget 中可用)作为模拟框架。但是您可以只更改测试属性并改用 MSTest。

对于相反的行为,我涵盖了常规应用和应用到空文本:

using System;
using System.Linq;
using Decorator;
using NUnit.Framework;

namespace StackOverflow.Tests.HowToTest
{
[TestFixture]
public class ReverseBehaviorTest
{
[Test]
public void Apply()
{
const string someText = "someText";
var target = new ReverseBehavior();
var result = target.Apply(someText);
Assert.AreEqual(someText.Reverse(), result);
}
[Test]
public void Apply_WhenNull()
{
var target = new ReverseBehavior();
var result = target.Apply(null);
Assert.AreEqual(String.Empty, result);
}
}
}

对于CachingDecorator,构造函数的异常抛出,应用缓存和不缓存:

using System;
using Decorator;
using Moq;
using NUnit.Framework;

namespace StackOverflow.Tests.HowToTest
{
[TestFixture]
public class CachingDecoratorTest
{
[Test]
public void Constructor()
{
Assert.Throws(typeof(ArgumentNullException), () => new CachingDecorator(null));
}

[Test]
public void Apply_NotCached()
{
var internalBehaviorMock = new Mock<IModifyBehavior>();
internalBehaviorMock.Setup(x => x.Apply(It.IsAny<string>())).Returns<string>(y => y);
const string someText = "someText";
var target = new CachingDecorator(internalBehaviorMock.Object);
target.Apply(someText);
internalBehaviorMock.Verify(x => x.Apply(It.IsAny<string>()), Times.Once());
}

[Test]
public void Apply_Cached()
{
var internalBehaviorMock = new Mock<IModifyBehavior>();
internalBehaviorMock.Setup(x => x.Apply(It.IsAny<string>())).Returns<string>(y => y);
const string someOtherText = "someOtherText";
var target = new CachingDecorator(internalBehaviorMock.Object);
target.Apply(someOtherText);
target.Apply(someOtherText);
internalBehaviorMock.Verify(x => x.Apply(It.IsAny<string>()), Times.Once());
}
}
}

关于c# - 如何在 C# 中对 if-else 语句进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15377009/

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