簡體   English   中英

使用 FromBody 參數 Web API 的 MS 測試

[英]MS Test with FromBody parameter Web API

我有一個 C# .Net Web API,我正在編寫並嘗試為一種方法構建 MSTest。

控制器

     public IHttpActionResult BlahMethod([FromBody] dynamic data)
        {
                string id = data.id;
                List<Property> Props = JsonConvert.DeserializeObject<List<Property>>(data.properties.ToString());
                User existing = _context.MyClass.Where(x => x.Properties.Any(y => y.PropertyLabel == "app" && y.PropertyValue == id)).FirstOrDefault();
                    return Json(existing);
        }

我正在嘗試使用類似於下面的模擬來測試此方法

測試方法

[TestMethod]
public void AllUsersTest()
{
    var mockSet = new Mock<DbSet<MyClass>>();
    var mockContext = new Mock<DBContext>();
    mockContext.Setup(m => m.MyClass).Returns(mockSet.Object);

    MyController controller = new MyController();
    List<Property> Props = new List<Property>() {
        new Property(){ PropertyLabel = "Nickname", PropertyValue = "TMoney"}
    };
    dynamic data = new TestObject("id", Props);
    var x = controller.BlahMethod(data);
    Assert.IsTrue(true);
}

班級

public class TestObject {
    public TestObject() { }
    public TestObject(string id, List<Property> props)
    {
        this.id = id;
        this.properties = props;
    }
    public string id { get; set; }
    public List<Property> properties { get; set; } = new List<Property>();

}    
public class Property{
     public string PropertyLabel {get; set;}
     public string PropertyValue {get; set;}
  }

我似乎遇到了 JsonReaderException 的問題。 出於某種原因,錯誤是說有一個意外的字符。 我也試過發送一個動態對象,這也導致了一個問題。 也許有人對使用發布的數據在 .net 中模擬 API 的最佳方法有一些建議?

該錯誤是控制器中以下行的結果:

List<Property> Props = JsonConvert.DeserializeObject<List<Property>>(data.properties.ToString());

在這一行中,您首先將屬性轉換為字符串,然后嘗試反序列化該字符串。 但是,轉換為字符串與序列化 JSON 不同。 因此對DeserializeObject的調用接收到無效字符串並引發錯誤。

在 Web API 中,您可以定義作為類接收的數據的模型,框架將為您處理反序列化。 因此,您可以簡單地在項目中定義一個包含所有必需屬性的類。 基本上,您可以將TestObject類從測試項目移動到 Web API 項目並實現如下操作:

public IHttpActionResult BlahMethod([FromBody] TestObject data)
{
  string id = data.id;
  var Props = data.properties;
  User existing = _context.MyClass.Where(x => x.Properties.Any(y => y.PropertyLabel == "app" && y.PropertyValue == id)).FirstOrDefault();
  if (existing == null)
    return NotFound();
  return Ok(existing);
}

更改后的操作確實通過使用 TestObject 作為參數來定義所需的輸入數據。 如果您使用 JSON 調用操作,Web API 框架將在調用您的操作之前為您轉換它。
在該方法中,您直接處理數據並將現有用戶也作為對象返回。 Web API 框架采用返回參數並將其序列化,以便調用者可以理解格式(通常為 JSON)。

至於您的單元測試,您可以像之前一樣創建一個示例TestObject ,並根據測試用例的需要設置屬性。 您可以直接使用數據調用操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM