[英]C# - how to test extension methods?
我为Person
类创建了这个C#扩展方法:
public static class PersonExtensions {
public static void Rename(this Person person, String newName) {
person.Name = newName;
}
}
我该如何对这种方法进行单元测试? 我已经尝试过,但PersonAccessor
对象无法使用Rename
方法。
错误是“找不到重命名的私有访问者”
当我尝试PersonExtensions_Accessor.Rename(somePerson,newName)时,它说“有一些无效的参数”
扩展方法只是语法糖,用于引用静态方法的不同方式。 只需在单元测试中调用PersonExtensions.Rename(...)
。
我认为一个好方法可能是直接测试Person
实例中的扩展方法。
考虑到您实现的方法,示例代码将是这样的:
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PersonExtension; // Don't forget about reference it
namespace UnitTest {
[TestClass]
public class UnitTest {
Person person;
[TestInitialize]
public void Init() {
person = new Person("Person name");
}
[TestMethod]
public void TestRename() {
Assert.AreEqual("Person name", person.Name);
person.Rename("New name");
Assert.AreEqual("New name", person.Name);
}
}
}
请记住引用Person
和PersonExtension
类,并在实用程序类中具有正确的隐藏级别,以便可以访问其方法
这是我的生产代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ClassLibrary1
{
public class Person
{
public string Name { get; set; }
}
public static class PersonExtensions
{
public static void Rename(this Person person, String newName)
{
person.Name = newName;
}
}
}
这是生成的测试的编辑版本:
using ClassLibrary1;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
namespace TestProject1
{
/// <summary>
///This is a test class for PersonExtensionsTest and is intended
///to contain all PersonExtensionsTest Unit Tests
///</summary>
[TestClass()]
public class PersonExtensionsTest
{
private TestContext testContextInstance;
/// <summary>
///Gets or sets the test context which provides
///information about and functionality for the current test run.
///</summary>
public TestContext TestContext
{
get
{
return testContextInstance;
}
set
{
testContextInstance = value;
}
}
#region Additional test attributes
//
//You can use the following additional attributes as you write your tests:
//
//Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext)
//{
//}
//
//Use ClassCleanup to run code after all tests in a class have run
//[ClassCleanup()]
//public static void MyClassCleanup()
//{
//}
//
//Use TestInitialize to run code before running each test
//[TestInitialize()]
//public void MyTestInitialize()
//{
//}
//
//Use TestCleanup to run code after each test has run
//[TestCleanup()]
//public void MyTestCleanup()
//{
//}
//
#endregion
/// <summary>
///A test for Rename
///</summary>
[TestMethod()]
public void RenameTest()
{
Person person = new Person(); // TODO: Initialize to an appropriate value
string newName = string.Empty; // TODO: Initialize to an appropriate value
PersonExtensions.Rename(person, newName); // this could also be written as person.Rename(newName);
Assert.AreEqual(person.Name, string.Empty);
}
}
}
测试通过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.