9

Personクラス用に次の C# 拡張メソッドを作成しました。

public static class PersonExtensions {
    public static void Rename(this Person person, String newName) {
        person.Name = newName;
    }
}

このメソッドを単体テストするにはどうすればよいですか? 試してみましたが、オブジェクトRenameからメソッドが利用できません。PersonAccessor

エラーは「名前変更のプライベートアクセサーが見つかりませんでした」でした

PersonExtensions_Accessor.Rename(somePerson, newName) を試すと、「無効な引数がいくつかあります」と表示されます

4

3 に答える 3

13

拡張メソッドは、静的メソッドを参照するための別の方法のための単なる構文糖衣です。PersonExtensions.Rename(...)単体テストを呼び出すだけです。

于 2012-06-21T15:40:25.280 に答える
5

のインスタンスで拡張メソッドを直接テストするのが良いアプローチだと思います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クラスの両方を参照し、ユーティリティ クラスに適切な隠しレベルを設定することを忘れないでください。

于 2014-03-07T00:37:01.933 に答える
1

ここに私の生産コードがあります:

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);
      }
   }
}

テストに合格します。

于 2012-06-21T15:39:03.560 に答える