Dot-Net

你如何起訂一個生活在 App_GlobalResource 中的 .resx?

  • July 5, 2013

我正在為 MVC3 Web 項目中的控制器編寫單元測試,但是當我的測試嘗試訪問這樣的資源時會拋出異常:

return Index(Resources.Strings.MyStringResource);

該資源是一個.resx名為Strings.

我正在使用Moq庫來實現HttpContextBase功能的單元測試,所以我想知道如何使用 Moq 庫來訪問 App_GlobalResource。

任何幫助或指示將不勝感激!

你不能,至少不能直接。從資源 (.resx) 文件生成的強類型類公開靜態方法,而不是實例方法。

因此,它們不能實現介面方法,也不是虛擬的;Moq要求至少滿足其中一個條件才能創建模擬。

為了解決這個問題,您將創建一個抽象,就像其他任何東西一樣:

public interface IResources
{
   string MyStringResource { get; }
}

您可以將它的實現傳遞(或註入)到您的控制器中,然後將其傳遞給您的Index方法。該實現可能如下所示:

public class ResourcesWrapper : IResources
{
   public string MyStringResource 
   { 
       get 
       { 
           return Resources.Strings.MyStringResource; 
       } 
   }
}

然後,當您進行測試時,您可以使用 Moq 創建IResources介面的模擬,並將其傳遞給您的控制器,如下所示:

// Create the mock.
var mock = new Mock<IResources>();

// Setup the property.
mock.SetupProperty(m => m.MyStringResource, "My Mocked Value");

// Pass the object somewhere for use.
Assert.AreEqual(mock.Object.MyStringResource, "My Mocked Value");

引用自:https://stackoverflow.com/questions/13013075