[英]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.